我尝试用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)
你可能并不真的需要这些,这可能是一个XY问题,但当你学习一门语言时,这些问题经常发生。您应该知道,您通常不需要像使用其他语言那样使用Python构建庞大的类层次结构。Python使用“duck typing”如果一个类有您想要使用的方法,只需调用它!在
另外,在调用
__init__
时,实例已经存在。你不能(很容易)把它换成另一个实例(尽管,实际上,任何事情都是可能的)。在如果你真的想实例化一个类,并根据传递给构造函数的内容接收本质上完全不同对象的实例,那么简单、直接的方法就是使用一个返回不同类实例的函数。在
然而为了完整起见,您应该知道类可以定义一个
__new__
方法,该方法在__init__
之前被调用。这个方法可以返回类的一个实例,或者一个完全不同的类的实例,或者它想要的任何东西。例如,您可以这样做:这适用于python2或python3。如果为3,则返回:
^{pr2}$我假设由于某种原因你不能改变A和B,你需要两者的功能。在
也许你需要两个不同的课程:
我不建议动态创建类。您可以使用函数来执行此操作,并且可以轻松地执行pickle之类的操作,因为它们在模块的全局命名空间中可用:
^{pr2}$但如果你坚持“动态创建类”
任何一种用法都是:
相关问题 更多 >
编程相关推荐