gpt4 book ai didi

python - 在不调用 __init__ 的情况下动态创建 type(self) 的实例?

转载 作者:太空狗 更新时间:2023-10-30 00:41:43 24 4
gpt4 key购买 nike

这很难解释。我有一个类应该支持 copy_stateonly() 方法。它应该返回一个残缺版本的对象,它只包含我想要的(复制的)数据成员。我希望这个例子能更好地解释它:

# everything inherits from this
class SuperBase:
def __init__(self):
self.state_var = 3 # this should be copied into future objects
self.non_state_var = 0 # we don't want to copy this

def copy_stateonly(self):
newobj = # ??????????? create instance without calling __init__
newobj.state_var = self.state_var
return newobj

# some clases inherit from this
class Base(SuperBase):
def __init__(self):
SuperBase.__init__(self)
self.isflying = True # we want to copy this, this is state
self.sprite = "sprites/plane_generic.png" # we must drop this

def copy_stateonly(self):
newobj = SuperBase.copy_stateonly(self)
newobj.isflying = self.isflying
return newobj

class A144fighter(Base):
def __init__(self, teamname): # note required __init__ argument
Base.__init__(self)
self.colors = ["black", "grey"] # we want to copy this, this is state
self.name = teamname # we must drop this

def copy_stateonly(self):
newobj = Base.copy_stateonly(self)
newobj.colors = self.colors[:]
return newobj

plane = A144fighter("team_blue")
plane_state = plane.copy_stateonly() # this should return an A144fighter object with only state_var, flying and colors set.

python 2.7

最佳答案

我不知道有什么方法可以在不调用 __init__() 的情况下创建经典类的新实例(这是您在示例中使用的实例)。可以使用

创建新型类的新实例( object 的后代)
object.__new__(cls)

其中 cls 是您要创建的对象类型。

另一种方法是使用 copy.copy() 进行复制,可能会覆盖 __getstate__()__setstate__() 来定义应该被复制。

编辑:要在不调用 __init__() 的情况下创建经典类 cls 的新实例,您可以使用以下 hack:

class EmptyClass:
pass

new_instance = EmptyClass()
new_instance.__class__ = cls
new_instance.__dict__.update(whatever)

关于python - 在不调用 __init__ 的情况下动态创建 type(self) 的实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8021589/

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