Python继承:使用父方法打印继承的变量时出现属性错误 我是python继承的新手,我遇到了一个简单的问题 打印出变量 我有一个家长班
我犯了个错误Python继承:使用父方法打印继承的变量时出现属性错误 我是python继承的新手,我遇到了一个简单的问题 打印出变量 我有一个家长班,python,inheritance,Python,Inheritance,我犯了个错误 AttributeError: 'A' object has no attribute '_prints__name' 我知道我可以用C++做,但我在努力解决问题。 在我的python代码中哪里是错误的 有人能帮忙吗?谢谢 Python没有实现私有变量,但它确实有助于降低名称与希望保持类私有的变量冲突的风险。如果实例变量以两个下划线开头,python将在类名前加上前缀。请参见So中的“名称损坏”,将重命名\u prints\u name变量\u prints\u name
AttributeError: 'A' object has no attribute '_prints__name'
-
我知道我可以用C++做,但我在努力解决问题。
在我的python代码中哪里是错误的
Python没有实现私有变量,但它确实有助于降低名称与希望保持类私有的变量冲突的风险。如果实例变量以两个下划线开头,python将在类名前加上前缀。请参见So中的“名称损坏”,将重命名
\u prints\u name
变量\u prints\u name
此方法有效,但不起作用时除外。继承类没有一种自然的方式来访问变量。通常这不是问题,因为它毕竟是类私有的。使用它的一种方法是在基类中调用方法。在这种情况下,您可能应该调用基类\uuuu init\uuuu
来设置变量。但是如果你想直接使用它,你可以自己打印名字
class prints:
def __init__(self):
self.__name = ""
def getName(self):
return self.__name
class A(prints):
def __init__(self):
self._prints__name = "A"
a = A()
n = a.getName()
print(n)
Python没有实现私有变量,但它确实有助于降低名称与希望保持类私有的变量冲突的风险。如果实例变量以两个下划线开头,python将在类名前加上前缀。请参见So中的“名称损坏”,将重命名
\u prints\u name
变量\u prints\u name
此方法有效,但不起作用时除外。继承类没有一种自然的方式来访问变量。通常这不是问题,因为它毕竟是类私有的。使用它的一种方法是在基类中调用方法。在这种情况下,您可能应该调用基类\uuuu init\uuuu
来设置变量。但是如果你想直接使用它,你可以自己打印名字
class prints:
def __init__(self):
self.__name = ""
def getName(self):
return self.__name
class A(prints):
def __init__(self):
self._prints__name = "A"
a = A()
n = a.getName()
print(n)
问题是您使用的是前缀为
\uu
的变量。
python官方上没有私有变量,但是当您使用前缀为\uuuuu
的变量时,它存储为\u className\uuu var
如果你偷看一眼里面的话
a.__dict__
Out[9]: {'_A__name': 'A'}
因此,当您执行a.getName()
时,您所期望的继承逻辑就会启动
通过查看打印的来搜索父级getName
。\uuuuu dict\uuuuu
(查找匹配项)
这将尝试解析父对象的\uu名称
,但在这种情况下,它会将其解析为\u打印self
的名称
,这是A
的一个实例
这称为名称混乱问题是您使用的变量前缀为\uuu
。
class prints:
def __init__(self, name):
self.name = ""
def getName(self):
return self.name
class A(prints):
def __init__(self):
self.name = "A"
a = A()
n = a.getName()
print(n)
python官方上没有私有变量,但是当您使用前缀为\uuuuu
的变量时,它存储为\u className\uuu var
如果你偷看一眼里面的话
a.__dict__
Out[9]: {'_A__name': 'A'}
因此,当您执行a.getName()
时,您所期望的继承逻辑就会启动
通过查看打印的来搜索父级getName
。\uuuuu dict\uuuuu
(查找匹配项)
这将尝试解析父对象的\uu名称
,但在这种情况下,它会将其解析为\u打印self
的名称
,这是A
的一个实例
这被称为名称弄乱
class prints:
def __init__(self, name):
self.name = ""
def getName(self):
return self.name
class A(prints):
def __init__(self):
self.name = "A"
a = A()
n = a.getName()
print(n)
请参阅python中的基础知识
请参阅python中的基础知识谢谢您的解释。我这样写是为了让家长成为一个虚拟类,这只是一种常见的ood实践。所以在这种情况下,我应该在父类中公开所有变量。谢谢谢谢你的解释。我这样写是为了让家长成为一个虚拟类,这只是一种常见的ood实践。所以在这种情况下,我应该在父类中公开所有变量。谢谢谢谢你的回答。我已经选择了一个答案,但感谢您的时间!谢谢你的回答。我已经选择了一个答案,但感谢您的时间!