Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python继承:使用父方法打印继承的变量时出现属性错误 我是python继承的新手,我遇到了一个简单的问题 打印出变量 我有一个家长班_Python_Inheritance - Fatal编程技术网

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实践。所以在这种情况下,我应该在父类中公开所有变量。谢谢谢谢你的回答。我已经选择了一个答案,但感谢您的时间!谢谢你的回答。我已经选择了一个答案,但感谢您的时间!