假设,我有一个自定义类,它不是从另一个类继承的(通常很难从中继承),而是构建一个包装器以及其他一些修改第二个类行为的函数。你知道吗
class TestClass:
def __init__(self, *args, **kwargs):
self.data = OrigClass(*args, **kwargs)
def __getitem__(self, key):
...
x = self.data.__getitem__(key)
...
def __setitem__(self, key, value):
...
self.data.__setitem__(key, value)
...
@staticmethod
def _try_attr(var, item):
if hasattr(var, item):
return var.__getattribute__(item)
else:
return None
def __getattr__(self, item):
return TestClass._try_attr(self._data, item)
def __repr__(self):
...
def __str__(self):
...
因此,TestClass
可以很好地处理新的修改,而对于使用__getattr__
的方法,使用OrigClass
来处理未重新实现的方法。但是,在交互模式(例如PyCharm的Python控制台)或其他模式下,当我尝试查看__dir__()
时,TestClass
中的__dir__()
不会显示/显示OrigClass
中也可以在TestClass
中访问的所有属性。你知道吗
我可以尝试在TestClass
中创建一个新的__dir__
函数来合并当前TestClass
的__dir__
和OrigClass
中的__dir__
来创建__dir__
(我使用的是python3.x)。似乎有一些帖子是这样写的(尽管不确定其中一些是否对python3.x有效)。你知道吗
然而,我担心的是OrigClass
和TestClass
中的常见函数,也就是说,如果在OrigClass
和TestClass
中都有__setitem__
、__getitem__
这样的函数,那么新的__dir__
将引用哪些函数?
是否有其他函数(例如一些__
函数,如__getitem__
、__setattr__
等)引用__dir__
?或者,换句话说,如果我重写__dir__
,是否有可能陷入递归循环?
__dir__
返回唯一字符串的列表;它将包含字符串'__setitem__'
和'__getitem__'
,而不引用特定的实现。你知道吗换句话说,如果它们引用
TestClass
或OrigClass
实现,则无所谓。以该名称访问TestClass
上的属性将找到TestClass
实现。__dir__
是纯信息性的,仅由dir()
命令使用。其他工具(如Pythonhelp()
系统)可能依赖于dir()
。你知道吗您不会进入递归循环,该方法完全是可选的,没有基本实现,因为
dir()
以其他方式收集有关对象的信息。您可以在
self.data
属性上使用dir()
,并附加到结果列表以创建TestClass
版本:结果字符串列表将按
dir()
再次排序。你知道吗相关问题 更多 >
编程相关推荐