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

时间:2017-06-20 16:23:52

标签: python-3.x syntax-highlighting private-members type-hinting

在我的课程MyHeader的方法中,我访问另一个_label对象MyHeader的私有媒体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中,这会导致语法突出显示错误" 访问类的受保护成员_label "。

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

    def check_header_update(self, new_header: MyHeader):

但是无法识别,并且在运行时会导致错误" NameError:name' MyHeader'未定义"。

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

2 个答案:

答案 0 :(得分:1)

输入您的功能的正确方法是使用forward references,然后输入您的check_header_update。请注意,我还要添加返回类型,以确保完整性:

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

类型需要成为字符串的原因是因为当您定义check_header_update时,MyHeader尚未完全定义,所以您不能参考。< / p>

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

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

答案 1 :(得分:0)

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