几个月前我刚刚开始学习Python,我试图理解不同__get*__
方法之间的差异:
__get__
__getattr__
__getattribute__
__getitem___
他们的__del*__
等价物:
__del__
__delattr__
__delete__
__delitem__
这些之间有什么区别?我什么时候应该使用另一个?大多数__get*__
方法都有__set*__
个等价物,但没有__setattribute__
吗?
答案 0 :(得分:32)
您列出的每种方法的文档都可以从documentation index 轻松访问。
无论如何,这可能是一个小扩展参考:
__get__
,__set__
和__del__
是描述符“简而言之,描述符是一种自定义在模型上引用属性时会发生什么的方法。” [official doc link]
周围有很好的解释,所以这里有一些参考文献:
__getattr__
,__getattribute__
,__setattr__
,__delattr__
是否可以定义的方法来自定义类实例的属性访问(使用,赋值或删除x.name
)的含义。 [official doc link]
示例1:
class Foo:
def __init__(self):
self.x = 10
def __getattr__(self, name):
return name
f = Foo()
f.x # -> 10
f.bar # -> 'bar'
示例2:
class Foo:
def __init__(self):
self.x = 10
def __getattr__(self,name):
return name
def __getattribute__(self, name):
if name == 'bar':
raise AttributeError
return 'getattribute'
f = Foo()
f.x # -> 'getattribute'
f.baz # -> 'getattribute'
f.bar # -> 'bar'
__getitem__
,__setitem__
,__delitem__
是否可以定义的方法来实现容器对象。 [official doc link]
示例:
class MyColors:
def __init__(self):
self._colors = {'yellow': 1, 'red': 2, 'blue': 3}
def __getitem__(self, name):
return self._colors.get(name, 100)
colors = MyColors()
colors['yellow'] # -> 1
colors['brown'] # -> 100
我希望这足以给你一个大致的想法。