加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

Python属性继承

发布时间:2020-12-16 21:54:52 所属栏目:Python 来源:网络整理
导读:我是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 = nameclass

我是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这两个下划线开头的属性被表示为私有变量.对这些没有实际的保护(也就是说:如果你能找到它,你可以访问它),但是它们被命名为不易访问. 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属性,在类型B的任何对象中也没有属性__name.您拥有的是_A__name属性.这就是名称修改的工作原理:__ attributename变为_classname__attributename

您可以使用_name代替,这只是未来用户的标志,这不应该是公开的.然后你的整个代码应该工作.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读