1

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

现在,根据“通常的准则”,我应该self._util_attr在里面声明NeatClass.__init__()

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

我知道在内部声明实例属性__init__()应该增加代码的可读性(参见这个这个SO 问题)——我完全同意。但是,在我的用例中,这样做可能会产生相反的效果。原因如下:

  • 在我的课堂上,只util_method()应该使用self._util_attr.
  • 虽然我想util_method成为我班级 API 的一部分,但它只会在极少数情况下使用(大多数情况下NeatClass根本不会使用此方法)。
  • mypy用来输入提示我的代码。在对 的调用期间NeatClass.__init__(),类型self._util_attr未知(因此是注释# type: ignore)。由于这个问题范围之外的原因,我不能使用Union或类似的东西来类型提示这个变量。

所以,我真正想做的是:

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 问题,但似乎没有一个问题与我在这里问的问题相同。

感谢您的时间!

4

0 回答 0