如何解决什么时候可以在“__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__()
中声明实例属性应该提高代码的可读性(请参阅 this 和 this 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
# ...
但是,我希望我的代码同时遵循 PEP8 和 Google Python Style Guide。因此,我搜索了这两个指南,以了解可以接受在 __init__()
之外声明实例属性的情况。正如你可能想象的那样,我没有找到任何东西。事实上,我根本没有发现任何关于“在__init__()
内部声明实例属性”的内容,这确实令人惊讶。这引出了我的问题:
Python 的通用样式指南(尤其是 PEP8 和 Google 的)中是否存在可以接受在 __init__()__
之外声明实例属性的情况?
在这些指南中指明实例属性仅应在 __init__()
内声明的位置的指针也将不胜感激。另外,欢迎就如何重构我的代码提出建议。
请注意,我不是在寻找意见(反过来,这会违反 StackOverflow 的指导方针)。我只是在寻找解决我描述的情况的 Python 最常见样式指南部分的参考。我也不认为这个问题是重复的 - 我已经阅读了其他几个 SO 关于这个主题的问题,但他们似乎都没有问我在这里问的同样的问题。
感谢您的宝贵时间!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。