最好的python方法返回类的初始化值,如果同一类
问题描述:
我有一个类,我希望它接受与初始化相同的类的实例;在这种情况下,它将简单地返回该实例。最好的python方法返回类的初始化值,如果同一类
原因是我希望这个类接受无数的初始化值,然后程序代码可以使用它作为一个具有已知属性的对象,而与它的初始化方式无关。
我想到的是这样的:
class c(object):
def __new__(cls, *args, **kwargs):
if isinstance(args[0], c):
return args[0]
else:
return super(c, cls).__new__(cls, *args, **kwargs)
的问题是,我不希望__init__()
以这种方式初始化时调用做。有没有其他方法?
谢谢!
答
您可能想要使用工厂(f.e.请参阅此question了解详细信息或Google)。 或者只是使用一个类的方法你想要的东西,FE:
class C(object):
@classmethod
def new(cls, *args, **kwargs):
if isinstance(args[0], cls):
return args[0]
else:
return cls(*args, **kwargs)
obj = C.new()
obj2 = C.new(obj)
答
您可以使用元类
class InstanceReturnMeta(type): # You should probably think of a better name
def __call__(cls, *args, **kwargs):
if args and isinstance(args[0], cls):
return args[0]
instance = cls.__new__(cls, *args, **kwargs)
instance.__init__(*args, **kwargs)
return instance
class Test(object):
__metaclass__ = InstanceReturnMeta
def __init__(self, value):
self.value = value
测试一下
In [3]: instance1 = Test(0)
In [4]: instance2 = Test(instance1)
In [5]: print id(instance1) == id(instance2)
Out[5]: True
的ID是相同的,因此,这两变量引用同一个实例。
P.S.我假设你使用Python 2,因为你的类明确地继承了object
。
答
这样做的标准方法是简单地不在__init__
中进行初始化。在__new__
。
你为什么不要'__init __()'被调用?如果__init __()被调用,但没有做任何事情,它会好吗? –
只有当args [0]不是类 – Pato
时,才应该调用'__init __()'。是的,你已经在你的问题中说过了。但我问你:为什么这很重要?你避免打电话有多重要?在初始化实例时,您可以轻松地使该调用无需执行任何操作,或者在使用其他值进行初始化时执行某些操作。 –