2017-07-14 189 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) 

但此時你被盜號類模擬工廠函數行爲。如果你想要一個工廠功能,建立一個工廠功能。