2
我正在尋找python屬性內置的純python實現來了解初始化如何工作。我發現很多處理描述符接口(獲得,集合)但沒有描述setter或deleter方法。 this(大致)是如何實現的?Python定製屬性與設置器
我正在尋找python屬性內置的純python實現來了解初始化如何工作。我發現很多處理描述符接口(獲得,集合)但沒有描述setter或deleter方法。 this(大致)是如何實現的?Python定製屬性與設置器
屬性是一個簡單,直接的描述符。描述符協議由三種方法組成:__get__
,__set__
和__delete__
。每個操作的屬性只是調用用戶提供的函數。
class my_property(object):
def __init__(self, getter, setter, deleter):
self.getter = getter
self.setter = setter
self.deleter = deleter
def __get__(self, instance, owner):
return self.getter(instance)
def __set__(self, instance, value):
self.setter(instance, value)
def __delete__(self, instance):
self.deleter(instance)
class Foo(object):
def __init__(self):
self._x = 42
def get_x(self):
print 'getter'
return self._x
def set_x(self, value):
print 'setter'
self._x = value
def del_x(self):
print 'deleter'
del self._x
x = my_property(get_x, set_x, del_x)
obj = Foo()
print obj.x
obj.x = 69
del obj.x
print obj.x
作爲評論:有一種簡單的方法可以將屬性添加到Python列表對象中。在一堂課中翹曲。
>>> class Foo(list): pass
>>> l = Foo([1,2,3])
>>> l.foo = 'bar'
>>> l
[1, 2, 3]
我對如何實現setter方法(property.setter)感興趣。 – Hernan
@Hernan:它改變了'fset'並返回'self'(或者可能返回它自己的副本,我不記得)。沒有涉及火箭科學。 –
這就是我的想法,但是在我放入帖子的鏈接中,通過查看我從屬性中繼承的類的操作並在__init__中添加了一個打印(args,kwargs),似乎是再次創建該屬性,而不僅僅是改變fset。這是真的嗎?這是爲什麼? – Hernan