gpt4 book ai didi

Python:是否有更改实例类的用例?

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

相关:Python object conversion

我最近了解到 Python 允许您像这样更改实例的类:

class Robe:
pass

class Dress:
pass

r = Robe()
r.__class__ = Dress

我正在尝试弄清楚是否存在像这样“转化”对象可能有用的情况。我在 IDLE 中搞砸了这个,我注意到的一件事是分配一个不同的类不会调用新类的 __init__ 方法,尽管如果需要可以显式地完成。

几乎我能想到的每个用例都可以通过组合得到更好的服务,但我是编码新手所以我知道什么。 ;)

最佳答案

很少有充分的理由对不相关的类执行此操作,例如您示例中的 RobeDress。如果不做一些工作,很难确保最终得到的对象处于正常状态。

但是,如果您想使用非标准工厂函数或构造函数来构建基对象,那么在从基类继承时它会很有用。这是一个例子:

class Base(object):
pass

def base_factory():
return Base() # in real code, this would probably be something opaque

def Derived(Base):
def __new__(cls):
self = base_factory() # get an instance of Base
self.__class__ = Derived # and turn it into an instance of Derived
return self

在此示例中,派生类的 __new__ 方法想要使用返回 Base 类实例的 base_factory 方法构造其对象.通常这种工厂在某处的图书馆中,您无法确定它是如何制造对象的(您不能只调用 Base()super(Derived, cls ).__new__(cls) 自己得到相同的结果)。

实例的 __class__ 属性被重写,这样调用 Derived.__new__ 的结果将是 Derived 类的实例,这确保它将调用 Derived.__init__ 方法(如果存在这样的方法)。

关于Python:是否有更改实例类的用例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15855836/

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