Python “\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\__`
注意评论中回答了这些问题 我注意到在Python “\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\__`,python,exception,python-datamodel,Python,Exception,Python Datamodel,注意评论中回答了这些问题 我注意到在\uuu getattribute\uuuu和\uuu getattr\uuuuu中有一些异常处理行为,我在文档或其他文章中找不到这些行为 考虑此类A。如果A的实例具有None属性,则访问该属性会引发AttributeError class A: def __getattribute__(self, item): value = object.__getattribute__(self, item) if value i
\uuu getattribute\uuuu
和\uuu getattr\uuuuu
中有一些异常处理行为,我在文档或其他文章中找不到这些行为
考虑此类A
。如果A
的实例具有None
属性,则访问该属性会引发AttributeError
class A:
def __getattribute__(self, item):
value = object.__getattribute__(self, item)
if value is None:
raise AttributeError('in __getattribute__')
return value
def __init__(self, a=None):
self.a = a
A(1).a # 1
A().a # raises AttributeError('in __getattribute__')
现在,on\uuuu getattribute\uuuu
上的
无条件调用以实现类实例的属性访问。如果该类还定义了\uuuuuGetAttr\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu()
,则后者将不会被调用,除非\uuuuuuuuuuuuuuuuuuuuuuuuGetAttribute\uuuuu
class A:
def __getattribute__(self, item):
value = object.__getattribute__(self, item)
if value is None:
raise AttributeError('in __getattribute__')
return value
def __init__(self, a=None):
self.a = a
A(1).a # 1
A().a # raises AttributeError('in __getattribute__')
从这一点上,我可以猜到在\uuuu getattribute\uuuu
中提出的任何AttributeError
都会被捕获,并且进程会推迟到\uu getattr\uuuu
,这样调用方就永远看不到AttributeError('in u getattribute\uuuu')
令我惊讶的是,不仅看到了错误,还看到了在A()上引发的AttributeError
。A
是\uuuu getattribute\uuuuuu
中的一个,就好像从未调用过\uu getattr\uuuuu
一样。除非\uuu getattr\uuu
提出自己的
def __getattr__(self, item):
raise AttributeError('in __getattr__')
在这种情况下,我们会看到出现AttributeError('in uu getattr_uu')
这里有什么规定?如果我在中提出了AttributeError
的一些子类Oops
,而不是AttributeError('in'uuuuuuu getattribute\uuuuuu')
,那么它们是否适用?总结了这些评论
(重点是我的)声明:
无条件调用以实现类实例的属性访问如果该类还定义了,则将不会调用后者,除非显式调用它或引发错误。此方法应返回(计算的)属性值或引发异常。为了避免此方法中的无限递归,其实现应始终使用相同的名称调用基类方法,以访问它所需的任何属性,例如,object.\uuuu getattribute\uuuuu(self,name)
混淆是因为假设uuu getattr_uuuu是从对象继承的(这是错误的):
目录(对象)
“UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU"新","减少","减少","增加","报告","设置属性","大小","str","子类钩子"
>>>
>>>对象。获取属性__
>>>对象。\u\u getattr__
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
AttributeError:类型对象“object”没有属性“\uuu getattr\uuuu”
虽然我可以理解为什么它可能会让一些人感到困惑,但从我所关心的(在多次阅读文档之后),很明显:
如果uuu getattr_uu.是从object继承的,那么(引用的)文本“如果类也定义了u getattr_uu()”将毫无意义总结注释
(重点是我的)声明:
无条件调用以实现类实例的属性访问如果该类还定义了,则将不会调用后者,除非显式调用它或引发错误。此方法应返回(计算的)属性值或引发异常。为了避免此方法中的无限递归,其实现应始终使用相同的名称调用基类方法,以访问它所需的任何属性,例如,object.\uuuu getattribute\uuuuu(self,name)
混淆是因为假设uuu getattr_uuuu是从对象继承的(这是错误的):
目录(对象)
“UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU"新","减少","减少","增加","报告","设置属性","大小","str","子类钩子"
>>>
>>>对象。获取属性__
>>>对象。\u\u getattr__
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
AttributeError:类型对象“object”没有属性“\uuu getattr\uuuu”
虽然我可以理解为什么它可能会让一些人感到困惑,但从我所关心的(在多次阅读文档之后),它非常清楚:
如果uu getattr_u_u_u_u_u_u_u_u_u_u_u_u_u_u_u_u_u_u_u)是从对象继承的,那么(引用的)文本“如果类还定义了u_ugetattr_u如果类也定义了
,那么就没有意义了
如果类也定义了-你的类没有定义\uuuuuu getattr\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu. 文档中的对象是什么意思?\uuuu getattr\uuuu
然后?啊,“可以定义以下方法来自定义类实例的属性访问(使用、分配或删除x.name)的含义。”那么这里的问题是什么?我没有看到任何。如果类也定义了
-你的类没有定义\uu getattr\uuuu
@snakecharmerb奇怪,那么继承自对象的\uu getattr\uuuu
会发生什么?奇怪-在对象上没有\uu getattr\uuu
(尝试对象)。文档中的对象是什么意思?\uuuu getattr\uuuu
然后?啊,“可以定义以下方法来自定义类实例的属性访问(使用、分配或删除x.name)的含义。”那么这里的问题是什么?我没有看到。