2016-08-09 57 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(...)

相关问题