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(),但我不知道如何访问它.同样,我不想最终得到一个类/静态方法,因为我不知道从我的工厂出来的类!
谢谢!
只是不要在类变量名中使用"__"并进行设置.
一些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.
如果您使用单个下划线"_"来表示该变量不应该在类之外使用,那么您的代码将按预期工作.