gpt4 book ai didi

python - python中的条件类继承

转载 作者:行者123 更新时间:2023-12-01 11:02:08 26 4
gpt4 key购买 nike

我正在尝试在 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__ 之前调用.这个方法可以返回一个类的实例,或者一个完全不同的类的实例,或者它想要的任何东西。因此,例如,您可以这样做:

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)

这适用于 Python 2 或 3。使用 3 它返回:
Class A doing something {}
Class B doing something []
True

关于python - python中的条件类继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32598363/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com