How to automate accessor definition?

Steven D'Aprano steve at REMOVE-THIS-cybersource.com.au
Sat Mar 20 22:31:32 EDT 2010


On 2010年3月20日 22:15:54 +0000, kj wrote:
> I need to create a class solely for the purpose of encapsulating a large
> number of disparate data items.

There's a built-in for that. It's called "dict". Syntax for item access 
is a tiny bit different, but still very common:
data['foo']
instead of
data.foo
If you need to customize item access, you need to modify __getitem__, 
__setitem__ and __delitem__ instead of __getattr__ etc., but otherwise 
they are nearly identical. Ignoring a few complications due to slots and 
inheritance, attribute access is built on top of item access, so you 
won't notice any performance hit (and you might see a tiny performance 
benefit).
> At the moment I have no plans for any
> methods for this class other than the bazillion accessors required to
> access these various instance variables.

Huh? If you have instance variables, why don't you refer to them by name?
x = MyClass() # create an instance
y = MyClass() # another variable bound to an instance
z = MyClass() # etc.
print x, y, z
> (In case it matters, this class
> is meant to be a private helper class internal to a module, and it won't
> be subclassed.)
>> What is "best practice" for implementing this sort of class *succinctly*
> (i.e. without a lot of repetitive accessor code)?

Leave the repetitive accessor code out. Python isn't Java.
http://dirtsimple.org/2004/12/python-is-not-java.html
> Also, one more question concerning syntax. Suppose that i represents an
> instance of this class. Is it possible to define the class to support
> this syntax
>> val = i.field
> i.field += 6

Classes already support that.
>>> class C(object):
... pass
...
>>> i = C()
>>> i.field = 42
>>> val = i.field
>>> i.field += 6
>>> print (val, i.field)
42 48
 
> ...rather than this one
>> val = i.get_field()
> i.set_field(i.get_field() + 6)
>> ?

Good grief! No wonder Java coders are so unproductive :(
-- 
Steven


More information about the Python-list mailing list

AltStyle によって変換されたページ (->オリジナル) /