最好的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__()以这种方式初始化时调用做。有没有其他方法?

谢谢!

+0

你为什么不要'__init __()'被调用?如果__init __()被调用,但没有做任何事情,它会好吗? –

+0

只有当args [0]不是类 – Pato

+0

时,才应该调用'__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__