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

enp*_*nax 1 python inheritance class-variables

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

这并不会造成问题,但是,当我从我的Interface继承时,我不想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
Run Code Online (Sandbox Code Playgroud)

执行

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

>>> sub.getHidden()
hidden

>>> sub.soTroublesome()
this is different per subclass!
Run Code Online (Sandbox Code Playgroud)

那么,我如何实现getHidden()访问实例的类'classvariable.我知道,我检查过的信息是可用的dir(),但我不知道如何访问它.同样,我不想最终得到一个类/静态方法,因为我不知道从我的工厂出来的类!

谢谢!

jsb*_*eno 5

只是不要在类变量名中使用"__"并进行设置.

一些Python编写和"文档"说,"__"前缀是在类中获得"私有"成员的Python方法.他们错了.

"__"前缀完全符合您的要求:确保在类中的方法中访问的变量访问在该精确类中定义的变量(而不是从其继承的任何类).

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

>>> class Hidden(object):
...   __hidden = False
... 
>>> dir(Hidden)
['_Hidden__hidden', '__class__',  ...]
Run Code Online (Sandbox Code Playgroud)

因此,您的getHidden方法将始终查找__much其名称实际更改为 _MySuperInterface__much的变量,而您想要的变量的名称已更改为_MySub__much.

如果您使用单个下划线"_"来表示该变量不应该在类之外使用,那么您的代码将按预期工作.