2006/12/21

property

property packages up three functions that get, set, or delete an attribute, and a docstring.
property(fget=None, fset=None, fdel=None, doc=None)

property() is a succinct way of building a data descriptor that triggers function calls upon access to an attribute

The property() builtin helps whenever a user interface has granted attribute access and then subsequent changes require the intervention of a method.

For example, if you want to define a size attribute that's computed, but also settable, you could write:

class C(object):
def get_size (self):
result = ... computation ...
return result
def set_size (self, size):
... compute something based on the size
and set internal state appropriately ...

# Define a property. The 'delete this attribute'
# method is defined as None, so the attribute
# can't be deleted.
size = property(get_size, set_size,
None,
"Storage size of this instance")

how property() is implemented in terms of the descriptor protocol, here is a pure Python equivalent:
class Property(object):
"Emulate PyProperty_Type() in Objects/descrobject.c"

def __init__(self, fget=None, fset=None, fdel=None, doc=None):
self.fget = fget
self.fset = fset
self.fdel = fdel
self.__doc__ = doc

def __get__(self, obj, objtype=None):
if obj is None:
return self
if self.fget is None:
raise AttributeError, "unreadable attribute"
return self.fget(obj)

def __set__(self, obj, value):
if self.fset is None:
raise AttributeError, "can't set attribute"
self.fset(obj, value)

def __delete__(self, obj):
if self.fdel is None:
raise AttributeError, "can't delete attribute"
self.fdel(obj)



沒有留言:

張貼留言