Python:从基类创建一个新的自身实例(可能通过反射?)

2024-05-16 15:26:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我有如下代码,我正在尝试重构它。在

# Abstract, do not instantiate Base
class Base:
    ...


class A(Base):
    ...
    def func():
        x = A(1, 2, 3)
        x.x()
        y = A(4, 5, 6)
        y.y()
        z = A(7, 8, 9)
        z.z()

class B(Base):
    ...
    def func():
        x = B(1, 2, 3)
        x.x()
        y = B(4, 5, 6)
        y.y()
        z = B(7, 8, 9)
        z.z()


class C(Base):
    ...
    def func():
        x = C(1, 2, 3)
        x.x()
        y = C(4, 5, 6)
        y.y()
        z = C(7, 8, 9)
        z.z()

由于需要递归来解决的问题,类将通过func()递归地调用自己(因此A将生成一些A,直到递归函数完成为止),而对我来说重构它的最好方法是动态创建类。如果有一种方法可以获得最终的运行时类,我可以将其重构为:

^{pr2}$

我不太了解Python及其反射功能,或者是否有其他更好的方法来实现这一点。在

这能做到吗?在

还有比反思更好的方法吗?在

注意:构造函数参数只是我编出来的任意占位符。在

注意2:性能与此无关,我只想知道这是否可能,如果可能——如何实现?在


编辑:根据回答的解决方案,此代码起作用:

class Test:
    def __init__(self):
        print("Made BaseClass")
    def func(self):
        rofl = self.__class__()
        print(rofl.__class__)

class SubClass(Test):
    def __init__(self):
        super().__init__()
        print("Made SubClass")

a = SubClass()
a.func()

Tags: 方法代码testselfabstractbaseinitdef
2条回答

可以使用值的__class__属性:

class A(object):
     pass

class B(A):
     pass

b = B()
c = b.__class__()

我认为你真正想要的是使用类方法而不是常规方法。在

您似乎没有在任何地方使用self。实际上,您甚至不需要一个实例来实现这些函数的工作。所以:

class Test:
    def __init__(self):
        print("Made BaseClass")
    @classmethod
    def func(cls):
        rofl = cls()
        print(rofl.__class__)

class SubClass(Test):
    def __init__(self):
        super().__init__()
        print("Made SubClass")

或者,对于你的真实情况:

^{pr2}$

相关问题 更多 >