4 回答
TA贡献1851条经验 获得超5个赞
property()
>>> property()<property object at 0x10ff07940>
>>> property().getter<built-in method getter of property object at 0x10ff07998 >>>> property().setter<built-in method setter of property object at 0x10ff07940 >>>> property().deleter<built-in method deleter of property object at 0x10ff07998>
>>> property().getter(None)<property object at 0x10ff079f0>
@decorator
@propertydef foo(self): return self._foo
def foo(self): return self._foo foo = property(foo)
fooproperty(foo)@foo.setter()property().setter
property
>>> def getter(self): print 'Get!'... >>> def setter(self, value): print 'Set to {!r}!'.format(value)... >>>
def deleter(self): print 'Delete!'... >>> prop = property(getter)>>> prop.fget is getterTrue>>> prop.fset is NoneTrue
>>> prop.fdel is NoneTrue.setter()
>>> prop = prop.setter(setter)>>> prop.fget is getterTrue>>> prop.fset is setterTrue>>> prop.fdel is NoneTrue
.deleter()
>>> prop = prop.deleter(deleter)>>> prop.fget is getterTrue>>> prop.fset is setterTrue>>> prop.fdel is deleterTrue
property.__get__(), .__set__().__delete__()
>>> class Foo(object): pass... >>> prop.__get__(Foo(), Foo)Get!>>> prop.__set__(Foo(), 'bar')Set to 'bar'!>>> prop.__delete__(Foo())Delete!
property()
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 if doc is None and fget is not None:
doc = fget.__doc__
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)
def getter(self, fget):
return type(self)(fget, self.fset, self.fdel, self.__doc__)
def setter(self, fset):
return type(self)(self.fget, fset, self.fdel, self.__doc__)
def deleter(self, fdel):
return type(self)(self.fget, self.fset, fdel, self.__doc__)TA贡献1719条经验 获得超6个赞
@property
class Thing:
def __init__(self, my_word):
self._word = my_word
@property
def word(self):
return self._word>>> print( Thing('ok').word )'ok'word
class Thing:
def __init__(self, my_word):
self._word = my_word def word(self):
return self._word>>> print( Thing('ok').word() )'ok'TA贡献1789条经验 获得超8个赞
@propertydef x(self): ...
def x(self): ...x = property(x)
而这反过来又是创建 property只需要一个吸气器。
@x.setterdef x(self, value): ...
x
x.deleter
添加回答
举报
