Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在不破坏python经典类中的默认行为的情况下实现u_getattr_uu_u方法_Python_Getattr - Fatal编程技术网

如何在不破坏python经典类中的默认行为的情况下实现u_getattr_uu_u方法

如何在不破坏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

我想向python经典类中的
\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的访问。