【发布时间】:2020-08-12 16:21:30
【问题描述】:
如此处所述:
https://docs.python.org/3/reference/datamodel.html#object.__get__
传递给 __get__ 方法的两个参数(不包括“self”)分别是对象和访问属性的类。第二个参数不是多余的吗? 此外,当“类”也是对象时,为什么需要区分对象和类访问?
所以,在我看来有两种可能性:
- 从对象访问属性,在这种情况下,owner 参数将等于 type(instance) em>,所以它没有带来新的信息
- 从类(“类型”对象)访问属性,在这种情况下,源对象仅位于 owner 参数中,并带有 实例 无
在我看来,如果只使用一个参数(例如 instance)将始终保存原始对象,则无论是否它是不是一个“类”。如果确实需要这些信息,可以使用isinstance(instance, type) 进行检查。
那么,为什么需要两个参数?
【问题讨论】:
-
我会说它与子类有关。也就是说,您在
class A中定义一个描述符,然后创建一个子类class B(A),然后创建一个对象b = B()并在该对象上使用该描述符。根据语义,您可能需要知道它是在哪个确切类型中定义的。 -
@rodrigo 我在 python3 中尝试了你的示例。从
a=A()访问时,所有者参数是A类;当从b=B()访问时,所有者参数是类 B。它看起来不像所有者持有定义描述符的类,它只是持有第一个参数的类型。 -
这是因为子类定义了“is-a”关系。
B类自动包含A类所做的一切,以及更多。 -
我刚刚测试过,你是对的!不过,我仍然认为这与子类有关。也许你可以使用这个额外的参数来链接到基类,比如为描述符实现
super。