Python的“__get * __”和“_del * __”方法有什么区别?

时间:2012-01-28 20:22:50

标签: python getter-setter standard-library accessor

几个月前我刚刚开始学习Python,我试图理解不同__get*__方法之间的差异:

__get__
__getattr__
__getattribute__
__getitem___

他们的__del*__等价物:

__del__
__delattr__
__delete__
__delitem__

这些之间有什么区别?我什么时候应该使用另一个?大多数__get*__方法都有__set*__个等价物,但没有__setattribute__吗?

1 个答案:

答案 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

我希望这足以给你一个大致的想法。