从父fi访问子类变量

2024-09-27 00:11:46 发布

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

我正在寻找一种从父类访问子类变量的方法,它是在另一个文件中实例化的。例如

在基本文件.py公司名称:

class A(object): #gets subclassed
    var = 0 #place holder

    def printTheVar(self):
        print self.var


class B(object):
    def buildAndCallA(self):
        a = A()
        a.printTheVar()

在实施文件.py公司名称:

^{pr2}$

当我跑步时:

$ python implementationfile.py

我得到0。我想要10英镑

当父类和实现类都在同一个文件中时,这显然不是问题,但我有一个项目结构,它不要求它们:

somedir/
| basefile.py
| implementations/
| -- implementationA.py
| -- implementationB.py
| -- implementationC.py

我认为abc模块可能会有所帮助,但我的实验证明到目前为止没有结果。在


Tags: 文件实例方法pyself名称objectvar
2条回答

@James的回答帮了我很多忙。为了清晰起见,这里有一个更全局化的方法,使用三个文件(这就是项目的组织方式)

在脚本.py公司名称:

if __name__ == '__main__':
    if sys.argv[0] == 'useImplementation1'
        import implementations.implementation1 as implementation
    elif sys.argv[1] == 'useImplementation2':
        import implementations.implementation2 as implementation

    b = implementation.B(cls=implementation)
    b.buildAndCallA()

在基本文件.py(注意A = cls.A这是关键):

^{pr2}$

实施1.py:

from basefile import *

class A(A):
    var = 10

如果可能,我建议您将要使用的类传递给buildAndCallA方法。所以应该是这样的:

def buildAndCallA(self,cls):
    a = cls()
    a.printTheVar()

然后你可以这样称呼它:

^{pr2}$

然后它将使用调用时作用域中的A类的任何版本。在

您甚至可以用一个默认参数来设置它,因此它将在默认情况下使用基本文件中的A版本,但您仍然可以在必要时重写它。在

def buildAndCallA(self,cls=A):
    a = cls()
    a.printTheVar()

然后,如果不带参数调用b.buildAndCallA(),它将从基文件构造A类的一个实例。在

相关问题 更多 >

    热门问题