gpt4 book ai didi

python - Python 中的实例类型

转载 作者:行者123 更新时间:2023-12-01 09:15:02 25 4
gpt4 key购买 nike

我遇到了这段代码,我很惊讶它向列表中添加了一个元素。

代码如下:

class Wrapper:
def __init__(self, object):
self.wrapped = object
def __getattr__(self,attrname):
print('Trace: '+attrname)
return getattr(self.wrapped,attrname)

X = Wrapper([1,2,3])
X.append(4)
print(X.wrapped)

我很惊讶,因为如果我运行 type(X),我会得到 __main__.Wrapper,这是有道理的,因为 X 是一个对象类Wrapper。因此,我不确定为什么 X.append 直接添加到属性 wrapped 中的列表。毕竟,X 的类型不是 list,而是 Wrapper。

调用不应该是X.wrapped.append(4)吗?这也有效。

我是初学者,这可能是一个基本问题。我很感激任何想法,并感谢您的帮助。

<小时/>

此代码取自 Mark Lutz 的书。我正在使用 Anaconda 3.6 发行版

最佳答案

该类只是在访问对象的原始属性之前添加一条打印语句。

要了解其工作原理,您必须了解一些关于 __getattr__ 的内容。做。这些方法的文档位于 data model section 下Python 手册:

Called when the default attribute access fails with an AttributeError (either __getattribute__() raises an AttributeError because name is not an instance attribute or an attribute in the class tree for self; or __get__() of a name property raises AttributeError). This method should either return the (computed) attribute value or raise an AttributeError exception.

. (点)运算符实际上是一个搜索或查找运算符,当您编写如下语句时:

foo.append(x)

你和我都理解这意味着“使用参数 x 调用 foo 对象的追加方法” - Python 试图在 foo 对象上搜索属性“append”,然后尝试使用参数调用它x

在自定义对象中,我们没有 append属性,触发 __getattr__称呼。

然后我们拦截对 __getattr__ 的调用,打印出调试语句,然后将此调用传递给实际对象(对其的引用位于 self.wrapped 中)。

简而言之,我们是说 - 嘿 - 我们知道我们的包装对象没有此属性,但是尝试通过调用其 __getattr__ 来查看包装对象是否具有该属性相反。

沿着链传递调用的概念允许灵 active ,因为我们模仿原始(包装的)对象会做什么 - 使我们的包装器非常通用。即使您传入字符串或任何其他 Python 对象,它也会起作用。

关于python - Python 中的实例类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51345545/

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