什么是将 __init__ 分离为子方法的干净方法,同时不会获得“在 __init__ 之外定义的实例属性 _”

问题描述

考虑

class A:
    def __init__():
        self._n1 = "n1"
        self._n2 = "n2"

        self._m1 = "m1"
        self._m2 = "m2"    

    def usage_foo(self):
        self._n1 = "n1 again"

控制这种初始化的一个方法是将其拆分为逻辑部分:

class A:
    def __init__(self):
        self.__init_n()
        self.__init_m()

    def __init_n(self):
        self._n1 = "n1"
        self._n2 = "n2"

    def __init_m(self):
        self._m1 = "m1"
        self._m2 = "m2"

    def usage_foo(self):
        self._n1 = "n1 again"

这比第一种方式有一个很好的干净优势,但 Pycharm 哭了:

Instance attribute _n1 defined outside __init__ 

self._n1 = "n1 again"

__init__ 分成子方法而不触发(好的)Pycharm 封装检查器的正确方法是什么?

我想让 Pycharm(或开发人员)知道(并强制执行)__init_n__init_m 是并且应该只从 __init__ 调用,或者实现这种模块化的另一种方式.

显然,我可以定义 class Nclass M,但我试图避免这种情况。


按照@TigerhawkT3 的评论进行编辑:

如果你在里面定义了 __init_n 和 __init_m,它还会对你大喊大叫吗? init 而不是将它们定义为实例方法?那会 当然强制他们只能在

调用
class A:
    def __init__(self):
        def init_n():
            self._n1 = "n1"
            self._n2 = "n2"

        def init_m():
            self._m1 = "m1"
            self._m2 = "m2"

        init_n()
        init_m()

    def usage_foo(self):
        self._n1 = "n1 again"

令人惊讶的是,它仍然在喊。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)