gpt4 book ai didi

python - 类名作为幂等类型转换函数

转载 作者:太空宇宙 更新时间:2023-11-03 13:11:48 27 4
gpt4 key购买 nike

我正在写一个自定义类型Foo,我想实现以下目标:写的时候

foo = Foo(bar)

那么如果 bar 已经是 Foo 的实例,那么 Foo(foo) 会返回未修改的对象,所以 foobar 指的是同一个对象。否则,应创建类型为 Foo 的新对象,以 Foo.__init__ 认为合适的任何方式使用来自 bar 的信息。

我该怎么做?

我认为 Foo.__new__ 是关键。如果 instanceof 检查成功,让 Foo.__new__ 返回现有对象应该相当容易,否则调用 super().__new__ .但是the documentation for __new__写道:

If __new__() returns an instance of cls, then the new instance’s __init__() method will be invoked like __init__(self[, ...]), where self is the new instance and the remaining arguments are the same as were passed to __new__().

在这种情况下,我将返回所请求类的实例,尽管不是新实例。我能以某种方式阻止对 __init__ 的调用吗?或者我是否必须在 __init__ 中添加一个检查来检测它是为新创建的实例还是为已经存在的实例调用?后者听起来像是应该避免的代码重复。

最佳答案

恕我直言,您应该直接使用__new____init__。在 init 中查看是否应该初始化一个新对象或已经有一个现有对象的测试非常简单,没有代码重复,恕我直言,增加的复杂性是可以接受的

class Foo:
def __new__(cls, obj):
if isinstance(obj, cls):
print("New: same object")
return obj
else:
print("New: create object")
return super(Foo, cls).__new__(cls)
def __init__(self, obj):
if self is obj:
print("init: same object")
else:
print("init: brand new object from ", obj)
# do the actual initialization

它按预期给出:

>>> foo = Foo("x")
New: create object
init: brand new object from x
>>> bar = Foo(foo)
New: same object
init: same object
>>> bar is foo
True

关于python - 类名作为幂等类型转换函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41890189/

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