gpt4 book ai didi

python - Python 的 "__get*__"和 "_del*__"方法有什么区别?

转载 作者:IT老高 更新时间:2023-10-28 20:21:46 28 4
gpt4 key购买 nike

几个月前我刚开始学习 Python,我正在尝试了解不同 __get*__ 方法之间的区别:

__get__
__getattr__
__getattribute__
__getitem___

以及它们的 __del*__ 等价物:

__del__
__delattr__
__delete__
__delitem__

它们之间有什么区别?我什么时候应该使用其中一种?大多数 __get*__ 方法具有 __set*__ 等效项,但没有 __setattribute__ 是否有特定原因?

最佳答案

您列出的每种方法的文档都可以从 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

我希望这足以让您大致了解一下。

关于python - Python 的 "__get*__"和 "_del*__"方法有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9048826/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com