从继承的实例访问本地classvariable

2024-06-11 15:35:24 发布

您现在位置:Python中文网/ 问答频道 /正文

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

这并不是一个真正的问题,但是,当我从接口继承时,我不想多次实现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()检查过的,但是我不知道如何访问它。 再说一次,我不想以类/静态方法结束,因为我不知道从我的工厂出来的类!你知道吗

谢谢!你知道吗


Tags: 实例方法selfis工厂defthishidden
2条回答

您肯定应该学习并尝试python成员访问的工作方式。使用交互式pythonshell(python在命令行中),导入模块并进行实验。你知道吗

print self.__class__.__much

阅读时通常不需要通过__class__访问类成员。改为作为普通成员访问它们:

print self.__much

Python通过名称损坏来支持私有成员,将MySuperInterface类的__much成员更改为_MySuperInterface__much。这是为了避免从子类访问私有成员,而这正是您要做的。你知道吗

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

print self._MySuperInterface__much
print self._MySub__much

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

只是不要在类变量名中使用“\uuuuuu”,这样就可以设置了。你知道吗

一些Python撰写的文章和“文档”说“\uuux”前缀是Python获取 班上的“私人”成员。他们错了。你知道吗

“uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。你知道吗

它的工作方式很简单:在编译时,前缀为“uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

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

因此,getHidden方法将始终查找名称实际更改为__much_MySuperInterface__much变量,而所需的变量名称更改为_MySub__much。你知道吗

如果您尽可能使用一个下划线“\”来表示该变量不应在类之外使用,那么您的代码将按预期工作。你知道吗

相关问题 更多 >