我几个月前刚开始学习Python,现在想要了解不同的__get*__
方法之间的区别:
__get__
__getattr__
__getattribute__
__getitem___
还有它们的__del*__
等同方法:
__del__
__delattr__
__delete__
__delitem__
它们之间有什么区别?我应该在何时使用其中之一?为什么大多数__get*__
方法都有相应的__set*__
,但没有__setattribute__
呢?
我几个月前刚开始学习Python,现在想要了解不同的__get*__
方法之间的区别:
__get__
__getattr__
__getattribute__
__getitem___
还有它们的__del*__
等同方法:
__del__
__delattr__
__delete__
__delitem__
它们之间有什么区别?我应该在何时使用其中之一?为什么大多数__get*__
方法都有相应的__set*__
,但没有__setattribute__
呢?
你列出的每个方法的文档都可以从文档索引轻松获取。
无论如何,这可能是一个稍微详细的参考:
__get__
,__set__
和__del__
是描述符"简而言之,描述符是自定义当您在模型上引用属性时发生的事件的一种方式。" [官方文档链接]
它们已经被很好地解释了,所以这里提供一些参考资料:
__getattr__
,__getattribute__
,__setattr__
,__delattr__
是可以定义的方法,用于自定义类实例的属性访问(使用、分配或删除x.name
)的含义。 [官方文档链接]
示例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__
这些是用于实现容器对象的方法。[官方文档链接]
例如:
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
我希望这足以给您一个大致的概念。
__get__
和__set__
应该在属性中定义,而不是在类中定义!我仍然认为我原帖中的所有方法都需要更具区分性的名称,但我突然感觉不那么无助了。谢谢。☺ - Zearin__getattr__
的情况下还需要__get__
,或者反过来。你提到的两个答案是相同的。 - overexchange
{get,set}item
之外(这些内容因为包含item
而突出),其他所有内容都垂直地紧挨着彼此分成两个小部分。其中一些名称确实过于简洁/相似,但情况并不像你描述的那么糟糕。 - user395760