从继承的实例访问本地类变量

时间:2014-04-22 06:23:51

标签: python inheritance class-variables

我有我的伪接口,我实施了几次。每个实现都应该存储一个基本上定义文件路径(模板)的变量。因为这些类是由工厂生成的,所以我不知道会出现哪个子类,因此,我想通过实例方法访问类变量。

这并不会造成问题,但是,当我从界面继承时,我不想多次实现getHidden()方法(在下面)。但是把它称之为它所记录的方式,总会隐藏起来。

class MySuperInterface(object):
    # class Variable
    __much = "hidden"

    # instance method
    def getHidden(self):
        print self.__class__.__much

class MySub(MySuperInterface):
    __much = "this is different per subclass!"

    def soTroublesome(self):
        print self.__class__.__much

执行

>>> sub = MySub() # I don't know this class!

>>> sub.getHidden()
hidden

>>> sub.soTroublesome()
this is different per subclass!

那么,我如何实现getHidden()来访问实例的类'classvariable。我知道,当我查看dir()时,信息可用,但我不知道如何访问它。 同样,我不想最终使用类/静态方法,因为我不知道从我的工厂出来的类!

谢谢!

2 个答案:

答案 0 :(得分:5)

不要使用" __"在类变量名称中,您已设置。

一些Python写作和"文档"说" __"前缀是Python的获取方式 "私人"班上的成员。他们错误

" __"前缀确切地发生在您身上:确保在类中的方法中访问的变量访问中确定的类中定义的变量(而不是从它继承的任何类)。

它的工作方式很简单:在编译时,名称前缀为" __"是"损坏",即改变如下:__much - > _classname__much

>>> class Hidden(object):
...   __hidden = False
... 
>>> dir(Hidden)
['_Hidden__hidden', '__class__',  ...]

因此,getHidden方法始终会查找名称实际更改为__much的{​​{1}}变量,而您想要的变量名称已更改为_MySuperInterface__much }。

如果你使用单个下划线" _"根据惯例,变量不应该在类之外使用,您的代码将按预期工作。

答案 1 :(得分:3)

您一定要学习并尝试python成员访问的工作原理。使用交互式Python shell(命令行中为python),导入模块并进行实验。

print self.__class__.__much

阅读时,您通常无需通过__class__访问班级成员。取而代之的是普通会员:

print self.__much

Python通过 name mangling 支持私有成员,将__much类的MySuperInterface成员更改为_MySuperInterface__much。这是为了避免从子类访问私有成员,这正是您要做的事情。

当您出于任何原因需要访问它时,您只需使用错位名称:

print self._MySuperInterface__much
print self._MySub__much

您通常应该避免使用它,而是重新考虑您的代码。最简单的方法是使用仍然表示内部实现成员的单个下划线,但不会触发名称修改。