gpt4 book ai didi

Python 属性继承

转载 作者:太空狗 更新时间:2023-10-30 00:31:55 25 4
gpt4 key购买 nike

我是 python 的新手,我不确定我在做什么是正确的。我有一个基类 A 和一个继承类 B

class A(object):

def __init__(self, name):
self.__name = name

@property
def name(self):
return self.__name

@name.setter
def name(self, name):
self.__name = name

class B(A):
def __init__(self, name):
super(NominalValue, self).__init__(name)

@property
def name2(self):
return self.__name2

@name2.setter
def name2(self, n):
self.__name2 = n

def toString():
print self.__name + self.__name2

if __name__ == "__main__":
instance = B('name');
instance.toString()

当我运行它时,它会提示类 B 没有任何属性 __name

AttributeError: 'B' object has no attribute '_B__name'

我显然没有正确地进行继承。您如何对待正确继承的属性并避免在继承的类中重复属性?

最佳答案

以两个下划线开头的属性,如您的 __name 表示为私有(private)变量。没有对这些进行实际的保护(也就是说:如果您能找到它,您就可以访问它),但它们的名称已被篡改,因此不太容易访问。 More information about that can be found on the docs page

Any identifier of the form __spam (at least two leading underscores, at most one trailing underscore) is textually replaced with _classname__spam, where classname is the current class name with leading underscore(s) stripped.

因此,即使您继承了 A__name 属性,您也没有任何属性 __name B 类型的对象。您拥有的是 _A__name 属性。这就是 name-mangling 的工作原理:__attributename 变成 _classname__attributename

您可以改用 _name,这只是向 future 用户发出的标志,表明这不应该公开。然后你的整个代码应该工作。

关于Python 属性继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28200979/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com