gpt4 book ai didi

python - 在 __get__、__getattr__ 和 __getattribute__ 之间做出决定有哪些经验法则?

转载 作者:太空狗 更新时间:2023-10-29 20:45:39 25 4
gpt4 key购买 nike

在给定的情况下,在给定的类中选择要实现哪些方法有哪些一般经验法则?

我已经阅读了文档,因此了解它们之间的区别。相反,我正在寻找有关如何通过更好地注意到使用它们的更微妙的机会以及何时使用它们来最好地将它们的使用集成到我的工作流程中的指导。那种事。有问题的方法是(据我所知):

## fallback
__getattr__
__setattr__
__delattr__

## full control
__getattribute__
##(no __setattribute__ ? What's the deal there?)

## (the descriptor protocol)
__get__
__set__
__delete__

最佳答案

__setattribute__ 不存在,因为__setattr__ 总是 被调用。 __getattr__ 仅在通过正常 channel (由 __getattribute__ 提供,因此该函数同样总是被调用).

描述符协议(protocol)与其他协议(protocol)略有正交。给定

class Foo(object):
def __init__(self):
self.x = 5

f = Foo()

以下是正确的:

  • f.x 将调用 f.__getattribute__('x') 如果已定义。
  • f.x 如果已定义,则不会调用 f.__getattr__('x')
  • f.y 将调用 f.__getattr__('y') 如果已定义,否则 f.__getattribute__('y') 如果 已定义。

描述符一个属性调用,而不是一个属性调用。即:

class MyDescriptor(object):
def __get__(...):
pass
def __set__(...):
pass

class Foo(object):
x = MyDescriptor()

f = Foo()

现在,f.x 会导致 type(f).__dict__['x'].__get__ 被调用,并且 f.x = 3会调用 type(f).__dict__['x'].__set__(3).

也就是说,Foo.__getattr__Foo.__getattribute__ 将用于查找 f.x references;一旦你有了它,f.x 会生成 type(f.x).__get__() 的结果(如果已定义),并且 f.x = y 会调用 f.x.__set__(y) 如果已定义。

(上面对 __get____set__ 的调用只是大致正确,因为我省略了参数 __get____set__ 实际收到,但这应该足以解释 __get____getattr[ibute]__ 之间的区别。)

换句话说,如果 MyDescriptor 没有定义 __get__,那么 f.x 将简单地返回 MyDescriptor .

关于python - 在 __get__、__getattr__ 和 __getattribute__ 之间做出决定有哪些经验法则?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25808477/

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