在我的课程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'未定义"。
知道如何以可接受的方式访问受保护的成员吗?
答案 0 :(得分:1)
输入您的功能的正确方法是使用forward references,然后输入您的check_header_update
。请注意,我还要添加返回类型,以确保完整性:
def check_header_update(self, new_header: 'MyHeader') -> None:
类型需要成为字符串的原因是因为当您定义check_header_update
时,MyHeader
尚未完全定义,所以您不能参考。< / p>
但是,我不记得这是否会最终解决问题。如果没有,那么我会:
_label
非私有
答案 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
)。