python中的条件类继承

2024-04-24 04:09:11 发布

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

我尝试用Python动态创建类,对类和类继承比较陌生。基本上,我希望我的最终对象根据不同的需要有不同的历史类型。我有一个解决办法,但我觉得一定有更好的办法。我梦到了这样的事情。在

class A:
    def __init__(self):
        self.history={}
    def do_something():
        pass

class B:
    def __init__(self):
        self.history=[]
    def do_something_else():
        pass

class C(A,B):
    def __init__(self, a=False, b=False):
        if a:
            A.__init__(self)
        elif b:
            B.__init__(self)

use1 = C(a=True)
use2 = C(b=True)

Tags: 对象selffalsetrue类型initdefpass
2条回答

你可能并不真的需要这些,这可能是一个XY问题,但当你学习一门语言时,这些问题经常发生。您应该知道,您通常不需要像使用其他语言那样使用Python构建庞大的类层次结构。Python使用“duck typing”如果一个类有您想要使用的方法,只需调用它!在

另外,在调用__init__时,实例已经存在。你不能(很容易)把它换成另一个实例(尽管,实际上,任何事情都是可能的)。在

如果你真的想实例化一个类,并根据传递给构造函数的内容接收本质上完全不同对象的实例,那么简单、直接的方法就是使用一个返回不同类实例的函数。在

然而为了完整起见,您应该知道类可以定义一个__new__方法,该方法在__init__之前被调用。这个方法可以返回类的一个实例,或者一个完全不同的类的实例,或者它想要的任何东西。例如,您可以这样做:

class A(object):
    def __init__(self):
        self.history={}
    def do_something(self):
        print("Class A doing something", self.history)

class B(object):
    def __init__(self):
        self.history=[]
    def do_something_else(self):
        print("Class B doing something", self.history)

class C(object):
    def __new__(cls, a=False, b=False):
        if a:
            return A()
        elif b:
            return B()

use1 = C(a=True)
use2 = C(b=True)
use3 = C()

use1.do_something()
use2.do_something_else()

print (use3 is None)

这适用于python2或python3。如果为3,则返回:

^{pr2}$

我假设由于某种原因你不能改变A和B,你需要两者的功能。在

也许你需要两个不同的课程:

class CAB(A, B): 
    '''uses A's __init__'''

class CBA(B, A):
    '''uses B's __init__'''

use1 = CAB()
use2 = CBA()

The goal is to dynamically create a class.

我不建议动态创建类。您可以使用函数来执行此操作,并且可以轻松地执行pickle之类的操作,因为它们在模块的全局命名空间中可用:

^{pr2}$

但如果你坚持“动态创建类”

def make_C(a=False, b=False):
    if a:
        return type('C', (A, B), {})()
    elif b:
        return type('C', (B, A), {})()

任何一种用法都是:

use1 = make_C(a=True)
use2 = make_C(b=True)

相关问题 更多 >