微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

什么时候可以在“__init__()”之外声明一个实例属性?

如何解决什么时候可以在“__init__()”之外声明一个实例属性?

我将首先描述我目前面临的困境。我有一堂课(我们称之为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__() 中声明实例属性应该提高代码的可读性(请参阅 thisthis 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 关于这个主题的问题,但他们似乎都没有问我在这里问的同样的问题。

感谢您的宝贵时间!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。