Kev*_* Li 4 python import inheritance base subclass
我有一个基类,它有一个方法,创建一个子类的实例,调用与输入字符串相同.
之前通过将子类和基类放在同一个文件中,并执行类似的操作globals()[name].
但是,现在,我已将子类拆分为其他文件.它们每个都import base在顶部有一个语句,所以我不能简单地在我的基类中导入子类,或者只有一个循环导入链.
这有什么解决方法吗?
在base.py中:
from basefactory import BaseFactory
class Base:
def __init__(self, arg1, arg2):
...
def resolve(self, element):
className = typing.getClassName(element)
return BaseFactory.getInstance(className, element, self)
Run Code Online (Sandbox Code Playgroud)
在basefactory.py中:
from file1 import *
from file2 import *
...
class BaseFactory:
@staticmethod
def getInstance(name, arg1, arg2):
subclass = globals()[name]
return subclass(arg1, arg2)
Run Code Online (Sandbox Code Playgroud)
在file1.py中:
from base import Base
class subclass1(Base):
def foo(self):
return self.arg1
Run Code Online (Sandbox Code Playgroud)
根据我的理解,你有:
一种解决方案是为工厂方法创建单独的函数/类,并将其放在与基类不同的文件中.此文件可以导入基类和派生类的所有文件,而不使用循环引用.
例如:
# base.py:
class baseClass():
def __init__(self):
self.name = "Base"
# sub1.py:
from base import baseClass
class sub1Class(baseClass):
def __init__(self):
self.name = "sub1"
# sub2.py:
from base import baseClass
class sub2Class(baseClass):
def __init__(self):
self.name = "sub2"
# factory.py:
from sub1 import sub1Class
from sub2 import sub2Class # should not create an error
mapping = {'sub1': sub1Class, 'sub2': sub2Class}
def create(baseType):
return mapping[baseType]
Run Code Online (Sandbox Code Playgroud)
实际上,更好的方法可能是使用类型:
type(name, bases, dict)返回一个新的类型对象.这实际上是类语句的动态形式.名称字符串是类名,并成为__name__属性; 基元元组列出基类并成为__bases__属性; 和dict字典是包含用于类定义体的命名空间,成为__dict__属性.例如,以下两个语句创建相同的类型对象:
>>> class X(object):
... a = 1
...
>>> X = type('X', (object,), dict(a=1))
Run Code Online (Sandbox Code Playgroud)
为什么不将决心转移到经理类?在Python中查看Class工厂中的域类.我不知道是否需要决心......你可以直接从获取类的名字self.__class__.__name__,并使用Python功能,如type()和isinstance()检查,如果他们是特定类型.
还可以看看:
你能用字符串在python中实例化一个类吗?
python是否具有Java Class.forName()的等价物?
| 归档时间: |
|
| 查看次数: |
11574 次 |
| 最近记录: |