从Python中的基类导入子类

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)

jco*_*ado 6

您可以将import失败的语句移动到创建子类对象的方法。


Ada*_*ris 5

根据我的理解,你有:

  1. 基类
  2. 来自基类的一系列派生类
  3. 基类中的工厂方法,用于实例化正确类型的派生类
  4. 派生类已拆分为文件,它们依赖于基类,但基类中的工厂方法取决于派生类

一种解决方案是为工厂方法创建单独的函数/类,并将其放在与基类不同的文件中.此文件可以导入基类和派生类的所有文件,而不使用循环引用.

例如:

# 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()的等价物?