我正在寻找一种从父类访问子类变量的方法,该类在不同的文件中实例化。例如
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
模块可能会有所帮助,但到目前为止我的实验已经证明没有结果。
答案 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