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

标签 python inheritance class-variables

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

这并没有真正造成问题,但是,当我从我的接口(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

执行

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

>>> sub.getHidden()
hidden

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

那么,我如何实现 getHidden() 来访问实例类的类变量。我知道,正如我使用 dir() 检查的那样,这些信息是可用的,但我不知道如何访问它。 同样,我不想以类/静态方法结束,因为我不知道从我的工厂中取出的类!

谢谢!

最佳答案

只需不要在类变量名称中使用“__”即可。

一些 Python 文章和“文档”说“__”前缀是 Python 的获取方式 类(class)中的“私有(private)”成员。他们错了

“__”前缀完全符合您的实际情况:确保在类内部的方法中访问的变量访问在那个确切的类中定义的变量(而不是任何类从它继承)。

它的工作方式很简单:在编译时,以“__”为前缀的名称被“破坏”,即像这样改变:__much -> _classname__much:

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

因此,您的getHidden 方法将始终寻找名称实际上已更改为_MySuperInterface__much__much 变量,而您想要的变量已其名称更改为 _MySub__much

如果您尽可能多地使用单个下划线“_”来表示该变量不应在类之外使用,您的代码将按预期工作。

关于python - 从继承实例访问本地类变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23211931/

相关文章:

python - 在 Python 中更改列表

python - 使用 sklearn 内部函数

java - 重载子类的构造函数

C++ 抽象类型初始化

java - 将父类实例对象转换为子类实例对象的行为

Python 类变量问题

objective-c - 在 Objective-C 中,是否可以为类变量设置默认值?

python - 使用 pandas 将多列缩减为一列

python - Python 中的非阻塞套接字?

java - 找不到符号方法