2017-07-14 155 views
0

我目前有两个调用类,像这样。从类函数调用返回对象

first_partition = Partition(samplename='Sample1', nS=5) 
second_partition = Partition(samplename='Sample2', nS=6, batchname = 'Batch1', nB=4). 

由于分区类需要在参数个数可变,在我的初始化,我有:

class Partition: 

    def __init__(self, **kwargs): 
     self.__dict__.update(kwargs) 

我想是有first_partition和second_partition返回分区对象的实例有两个实例变量 - k和n - 取决于我调用的输入。

我试图做一个单独的类方法:

def pobject(self): 
    nargin = len(self.__dict__) 
    # Return default object if no arguments 
    if nargin == 0: 
     self.n = 3 
     self.k = 0 
     return self.n, self.j 
    else if nargin == 2: 
     self.n = 0 
     self.k = self.nS + 1 
     return self.n, self.j 

但返回k和n,我必须做的:

first_partition = Partition(samplename='Sample1', nS=5) 
print(first_partition.pobject()) 

我要的是第一线返回的东西,当我打电话

first_partition = Partition(samplename='Sample1', nS=5) 

我知道回不了任何东西,所以我想def __new__而不是def pobject,但它不起作用,并给我一个AtrributeError

+0

如果你只是想'k'和'​​n',为什么这个课甚至是一个班? – user2357112

+0

或者如果你想要实例,为什么不在'__init__'中设置'k'和'​​n'属性? – user2357112

+0

你可以在你的类中定义一个自定义的'__call__'方法,然后执行:'print Partition(samplename ='Sample1',nS = 5)()'__call__'然后可以派发到'pobject'方法 – JacobIRR

回答

0

您可以更改__new__()做上传递的参数检查,并返回基于各种数据,不一定是实例本身:

class Partition(object): 

    def __new__(cls, **kwargs): 
     nargin = len(kwargs) 
     if nargin == 0: 
      return 3, 0 
     elif nargin == 2: 
      return 0, kwargs["nS"] + 1 
     # in other cases return a class instance... 
     return super(Partition, cls).__new__(cls) 

    def __init__(self, **kwargs): 
     self.__dict__.update(kwargs) 

但此时你被盗号类模拟工厂函数行为。如果你想要一个工厂功能,建立一个工厂功能。