python / PyCharm: 访问同一class的另一个对象的受保护成员

python / PyCharm: access to a protected member of another object of the same class

在我的 class MyHeader 的方法中,我访问了另一个 MyHeader 对象的私有 属性 _label new_header:

class MyHeader:
    def __init__(self, label, n_elem):
        self._label = label
        self._n_elem = n_elem

    def check_header_update(self, new_header):
        # check that label is preserved
        if new_header._label != self._label:
            raise Exception("new header must have the same label")

在 PyCharm 中,这会导致语法突出显示错误“访问 class 的受保护成员 _label”。

我尝试指定 new_header 参数的类型:

    def check_header_update(self, new_header: MyHeader):

但这无法识别,并且在 运行 时这会导致错误“NameError:名称 'MyHeader' 未定义 ”。

知道如何以可接受的方式访问受保护的成员吗?

输入函数的正确方法是使用 forward references,然后像这样输入 check_header_update。请注意,为了完整起见,我还添加了 return 类型:

def check_header_update(self, new_header: 'MyHeader') -> None:

之所以类型需要是字符串是因为你在定义check_header_update的时候,MyHeader还没有完全定义,所以不是可以参考的.

但是,我不记得这最终是否会解决问题。如果没有,那么我会:

  1. 通过删除下划线
  2. 使_label非私有
  3. 制作某种getter method or use properties让其他人访问该数据

您的初始代码示例没有任何问题。只是 PyCharm 不会尝试猜测您的参数类型。我使用的大多数代码库都有数千条警告,甚至来自 IDE 分析的错误。你无法解决所有问题。

反正你可以通过方法docstring指定参数的类型,PyCharm就不会再喊警告了:

class MyHeader:
def __init__(self, label, n_elem):
    self._label = label
    self._n_elem = n_elem

def check_header_update(self, new_header):
    """
    :type new_header: MyHeader
    """
    if new_header._label != self._label:
        raise Exception("new header must have the same label")

请注意,这也适用于联合类型(例如:str | MyHeader)。