2016-08-09 60 views
0

我想在一個類的成員函數返回一個類的實例,我的代碼是:如何在類的成員函數中返回類實例?

class MyClass(object): 
    def __init__(self, *args, **kwargs): 
     [snippet] 

    def func(self, *args, **kwargs): 
     [snippet] 
     return class_instnace_of_MyClass 

if __name__ == '__main__': 
    obj = MyClass(...) 
    newobj = obj.func(...) # type(newobj) is MyClass 

我想我可以打電話__init__()func(),並返回MyClass的一個新的實例,但我不認爲這是一種Pythonic的方式。我應該怎麼做?謝謝!

回答

1

我覺得你應該使用@classmethod裝飾這個,如果我正在閱讀你的問題的權利。喜歡的東西:

class myClass(object): 

    def __int__(name): 
     self.name = name 

    @classmethod 
    def from_fancy(cls, name): 
     #do something with name, maybe make it 
     #lowercase or something... 
     return cls(name) 

例如,在pandas包你可以做這樣的事情pandas.DataFrame.from_csv(...)pandas.DataFrame.from_json(...)創建DateFrame對象。每種類都是返回一個DataFrame對象的類方法,該對象使用不同的初始數據集(csv文本文件或JSON文本文件)創建。

例如,你會說它是這樣的:

my_new_object = myClass.from_fancy("hello world") 

有上@classmethodhere

+0

不必要的一個很好的線索,在@classicmethod魔術會照顧它,至少在Python 2.x中。不知道python 3.x – reptilicus

+0

@AlexanderYau你什麼也沒做。只需在那裏使用代碼即可。沒有其他的。歡迎來到python的簡單,你必須習慣它。 –

+0

@AlexanderYau確保你真的需要這個:你不能只擴展'__init__'嗎?在python中創建對象的正確方法是使用'__init__'。 python中的所有方法都是公共的 –

2

__init__是Python中的類構造函數。它絕不會返回任何東西,這意味着它的值是None。將參數傳遞給空的func()是徒勞的。你的假設是真實的,那不是創建另一個MyClass實例的Pythonic方法。

如果你想創建的MyClass一個新實例只是這樣做:

obj = MyClass(...) # First instance 
newobj = MyClass(...) # Add another instance 

瞭解更多關於類對象及其實例here

2

return從方法的新實例,實例的方法的類,並返回一個新的實例,就像這樣:

class MyClass(object): 
    def __init__(self, *args, **kwargs): 
     pass 

    def func(self, *args, **kwargs): 
     ... 
     return MyClass(...) 

if __name__ == '__main__': 
    obj = MyClass(...) 
    newobj = obj.func(...) 

代替旋轉木馬輪,你能夠或者只是newobj = MyClass(...)

相關問題