0

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

基本文件.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:

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模块可能会有所帮助,但到目前为止我的实验证明是徒劳的。

4

2 回答 2

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从基本文件构造类的实例。

于 2013-05-29T17:01:17.053 回答
0

@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()

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

实现1.py:

from basefile import *

class A(A):
    var = 10
于 2013-05-29T20:26:23.557 回答