如何在不破坏python经典类中的默认行为的情况下实现u_getattr_uu_u方法
我想向python经典类中的如何在不破坏python经典类中的默认行为的情况下实现u_getattr_uu_u方法,python,getattr,Python,Getattr,我想向python经典类中的\uu getattr\uu方法添加一些日志记录。它正常工作,但是当使用操作符重载时,出现了一些问题 我的代码如下: class A: def __getattr__(self, item): print('attr:'+ item) def __getattribute__(self, item): print('attribute:' + item) return object.__getattrib
\uu getattr\uu
方法添加一些日志记录。它正常工作,但是当使用操作符重载时,出现了一些问题
我的代码如下:
class A:
def __getattr__(self, item):
print('attr:'+ item)
def __getattribute__(self, item):
print('attribute:' + item)
return object.__getattribute__(self, item)
def __add__(self, other):
return 2
b = A()
a = b + 1
print(a)
在
a=b+1
行中,它将运行\uuuuu getattr\uuuu
方法,项的值将为\uuu强制
。在这种情况下,我不知道如何处理它。您遇到的问题是您的\uuu getattr\uuu
方法返回None
。由于这是一个有效的属性值,Python不知道这只是没有return
语句的函数的默认返回值
如果您没有任何内容可从\uu getattr\uuu
返回,您可能应该引发属性错误
,而不是默认返回无
。在这种特定情况下,Python正在检查\uuuuuuuuuuuuuuuuuu
方法。如果存在属性错误
,则该错误将被抑制,解释器将依赖于其他行为(使用\uuuuuuuu添加
)。试着这样做:
def __getattr__(self, item):
print('attr:', item)
raise AttributeError("%s object has no attribute named %r" %
(self.__class__.__name__, item))
现在,Python自动查找\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
将失败,但由于它以预期的方式失败,异常将被忽略,并且将按您的预期调用\uuuuuuuuuuuuuuuuu
最后一件事:Python中的旧式类已经完全过时(并且已经从Python3中删除)。除非需要在运行在Python 2.2之前版本(该版本于12年前于2001年发布,所以这个兼容性问题变得有点可笑)上的非常旧的软件中保持兼容性,否则不应该使用它们。对于不必使用如此古老的Python版本的新代码,您应该在任何地方使用新样式的类。因为您使用的是旧式类,所以将永远不会调用您的\uuuu getattribute\uuuuu
方法(仅\uuuuu getattr\uuuuuu
)。为什么要使用旧式类?请注意,\uuuuuGetAttribute\uuuuuuuuuu
无论如何都不能用于旧样式的类。基本方法是返回self.\uuuuuu dict\uuuuuu[item]。在上面的例子中,它是有效的。但是你应该小心:如果你实现了setattr,你可能会有很多问题;如果设置元类,事情会变得更复杂。发布一个更清晰的示例,因此getattr的实际使用是显而易见的。在上面的代码中,它只是减慢了对类数据/attr的访问。