从父文件访问子类变量

时间:2013-05-29 16:55:31

标签: python abc

我正在寻找一种从父类访问子类变量的方法,该类在不同的文件中实例化。例如

basefile.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()

implementationfile.py:

from basefile import *

class A(A):
    var = 10

if __name__ == '__main__':
    b = B()
    b.buildAndCallA()

当我跑步时:

$ python implementationfile.py

我得到0.我想得到10

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

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

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

2 个答案:

答案 0 :(得分:1)

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

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

然后你可以这样称呼它:

b.buildAndCallA(A)

然后它会在调用时使用A类的任何版本。

您甚至可以使用默认参数进行设置,因此默认情况下它会在基本文件中使用A版本,但您仍可以在必要时覆盖它。

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

然后,如果您在没有参数的情况下调用b.buildAndCallA(),它将从基本文件构造A类的实例。

答案 1 :(得分:0)

@詹姆斯的答案让我了解了大部分方法。为了清晰起见,这是一个更全面的方法,使用三个文件(这实际上是项目的组织方式)

script.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()

basefile.py(注意A = cls.A这是关键字):

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

    def printTheVar(self):
        print self.var


class B(object):
    def __init__(self,cls):
        global A
        A = cls.A

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

implementation1.py:

from basefile import *

class A(A):
    var = 10