Python 3.x python/PyCharm:访问同一类的另一个对象的受保护成员

Python 3.x python/PyCharm:访问同一类的另一个对象的受保护成员,python-3.x,syntax-highlighting,private-members,type-hinting,Python 3.x,Syntax Highlighting,Private Members,Type Hinting,在我的类MyHeader的方法中,我访问另一个MyHeader对象new\u 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 preserv

在我的类
MyHeader
的方法中,我访问另一个
MyHeader
对象
new\u 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中,这会导致语法突出显示错误“访问受保护的成员\u类的标签”

我尝试指定
new_头的类型
参数:

    def check_header_update(self, new_header: MyHeader):
但这是无法识别的,在运行时会导致错误“namererror:name'MyHeader'未定义”


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

键入函数的正确方法是使用,然后键入您的
check\u header\u update
,就像这样。注意,为了完整起见,我还添加了返回类型:

def check_header_update(self, new_header: 'MyHeader') -> None:
该类型需要为字符串的原因是,在定义
check\u header\u update
时,
MyHeader
尚未完全定义,因此您无法参考

然而,我不记得这是否能解决问题。如果没有,我会:

  • 通过删除下划线,使标签
  • 非私有
  • 做一些让其他人访问这些数据的事情

  • 您的初始代码示例没有任何错误。只是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
    )。

    还感谢指向文档的指针。另外,在我的课堂环境中,
    \u label
    仍然是私有的,所以我很高兴它是这样工作的。我认为对于初学者来说,最好的答案是包含一个@property用法的示例