什么时候可以在“\uuu init\uuu()”之外声明实例属性?

2024-09-30 01:21:43 发布

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

我将从描述我目前面临的困境开始。我有一个类(我们称之为NeatClass)。它有几个实例属性,我通常在类__init__()方法中声明所有这些属性。我正在向类中添加一个新方法(我们称之为util_method()),它需要在调用之间保持一个内部状态。我的意图是将该状态存储在实例属性中(我们称之为self._util_attr

现在,根据“常规指南”,我应该在{}内声明{}:

class NeatClass:
    def __init__():
        self.attr1 = ...
        self.attr2 = ...
        # ...
        self._util_attr = None  # type: ignore

我知道在__init__()内声明实例属性应该可以提高代码的可读性(请参见thisthis等等问题)——我完全同意这一点。然而,在我的用例中,这样做可能会产生相反的效果。原因如下:

  • 在我的类中,只有util_method()应该使用self._util_attr
  • 虽然我希望util_method成为我的类的API的一部分,但它只在少数情况下使用(大多数NeatClass实例根本不会使用此方法)
  • 我正在使用mypy键入提示代码。在调用NeatClass.__init__()期间,self._util_attr的类型未知(因此注释# type: ignore)。由于超出这个问题范围的原因,我不能使用Union或类似的东西来键入hint这个变量

所以,我真正想做的是:

class NeatClass:
    def __init__():
        self.attr1 = ...
        self.attr2 = ...
        # ...

    def util_method(self):
        if not hasattr(self, "_util_attr"):
            self._util_attr = ...  # initial value of the variable
        # ...

但是,我希望我的代码同时遵循PEP8Google Python Style Guide。因此,我在这两条准则中搜索了对在__init__()之外声明实例属性是可以接受的情况的引用。正如你可能想象的那样,我什么也没找到。事实上,我根本没有找到任何关于“在__init__()内声明实例属性”的内容,这真是令人惊讶。这就引出了我的问题:

在Python的通用样式指南(特别是PEP8和Google的)中,是否存在允许在__init__()__之外声明实例属性的情况?

在这些指导原则中,指向指定实例属性只应在__init__()内声明的位置的指针也是值得赞赏的。此外,关于如何重构我的代码的建议也是受欢迎的

请注意,我不是在寻求意见(这反过来会违反StackOverflow的指导方针)。我只是在寻找Python最常见的样式指南中针对我描述的情况的部分的参考。我也不认为这个问题是重复的——我读过其他几个SO关于这个问题的问题,他们似乎都没有问我这里要问的问题

谢谢你抽出时间


Tags: 实例方法代码self声明属性init状态

热门问题