在python中继承私有变量[重复]

Posted

技术标签:

【中文标题】在python中继承私有变量[重复]【英文标题】:inheriting private variable in python [duplicate] 【发布时间】:2017-04-08 04:26:23 【问题描述】:

在python中继承时,私有变量出现以下错误:

AttributeError: 'dog' 对象没有属性 '_dog__name'

我搜索了很多,但不明白我的问题出在哪里;

class animal(object):
    __name = ""
    __height = ""
    __weight = ""
    __sound = ""

    def __init__(self, name, height, weight, sound):
        self.__name = name
        self.__height = height
        self.__weight = weight
        self.__sound = sound


    def toString(self):
        return " is  cm and  weight and say .".format(self.__name, self.__height, self.__weight, self.__sound)

class dog(animal):
    __owner = ""

    def __init__(self, name, height, weight, sound, owner):
        self.__owner = owner
        super(dog, self).__init__(name, height, weight, sound)

    def toString(self):
        return " is  cm and  weight and say  and belongs to .".format(self.__name, self.__height,
                                                                                self.__weight, self.__sound,
                                                                                self.__owner)

puppy = dog('puppy', 45, 15, 'bark', 'alex')

puppy.toString()

【问题讨论】:

不,这是关于变量,而不是方法。 机制是一样的。哎呀,它甚至会影响类语句中的局部变量和导入的模块。 【参考方案1】:

当您创建带有双下划线的 var 时,它只是一种用于将其表示为私有变量的符号,python 会对变量名本身进行名称修改以防止正常方式访问它。

但是,它仍然不是像 C/C++ 那样真正的私有变量。您仍然可以使用以下语法访问所谓的 python“private var”

var = __myvar
# access with _<class name>__myvar

来自PEP,

_single_leading_underscore:弱“内部使用”指标。例如。 from M import * 不导入名称以 下划线。 __double_leading_underscore : 命名类属性时,调用名称修改(在类 FooBar 中,__boo 变为 _FooBar__boo

对于您的情况,将您的狗类 toString 方法更改为以下,然后它应该可以工作

def toString(self):
    return " is  cm and  weight and say  and belongs to .".format(self._animal__name, self._animal__height,
                                                                                self._animal__weight, self._animal__sound,
                                                                                self.__owner) # __owner remains because its not inherit from class animal

如果您真的不需要双下划线__,另一种选择是将您的动物类变量更改为单下划线_

【讨论】:

tnx,python 3 和 2 一样吗? 我想是的,python 2和3应该是一样的 因为在这个视频中,教练运行完全相同的代码没有任何错误; youtu.be/N4mEzFDjqtA?t=39m44s 我已经用我的 python3.2 进行了测试,它与 python2 的行为相同,python 3 文档https://docs.python.org/3/tutorial/classes.html 显示名称修改相同,不知道为什么它在视频中有效

以上是关于在python中继承私有变量[重复]的主要内容,如果未能解决你的问题,请参考以下文章

私有成员是不是在 C# 中继承?

子类可以继承父类的一切方法,成员变量,甚至是私有的,但是却不能够访问这些私有的成员变量和方法

C#中继承类为啥可以通过属性访问基类的私有字段。

子类能不能继承父类的成员变量

在Python中声明私有变量[重复]

Python中的私有变量和方法[重复]