在python中覆盖目录会发生递归循环吗

2024-04-24 14:40:57 发布

您现在位置:Python中文网/ 问答频道 /正文

假设,我有一个自定义类,它不是从另一个类继承的(通常很难从中继承),而是构建一个包装器以及其他一些修改第二个类行为的函数。你知道吗

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有效)。你知道吗

  1. 然而,我担心的是OrigClassTestClass中的常见函数,也就是说,如果在OrigClassTestClass中都有__setitem____getitem__这样的函数,那么新的__dir__将引用哪些函数?

  2. 是否有其他函数(例如一些__函数,如__getitem____setattr__等)引用__dir__?或者,换句话说,如果我重写__dir__,是否有可能陷入递归循环?


Tags: key函数selfdatareturnvardefdir
1条回答
网友
1楼 · 发布于 2024-04-24 14:40:57
  1. __dir__返回唯一字符串的列表;它将包含字符串'__setitem__''__getitem__',而不引用特定的实现。你知道吗

    换句话说,如果它们引用TestClassOrigClass实现,则无所谓。以该名称访问TestClass上的属性将找到TestClass实现。

  2. __dir__是纯信息性的,仅由dir()命令使用。其他工具(如Pythonhelp()系统)可能依赖于dir()。你知道吗

    您不会进入递归循环,该方法完全是可选的,没有基本实现,因为dir()以其他方式收集有关对象的信息。

您可以在self.data属性上使用dir(),并附加到结果列表以创建TestClass版本:

def __dir__(self):
    base = dir(self.data)
    base.extend(('_try_attr', 'data'))
    return base

结果字符串列表将按dir()再次排序。你知道吗

相关问题 更多 >