如何在类的成员函数中返回类实例?

时间:2016-08-09 01:12:53

标签: python-2.7

我想在类的成员函数中返回一个类实例,我的代码是:

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方式。我该怎么办?谢谢!

3 个答案:

答案 0 :(得分:2)

__init__是Python中的类构造函数。在任何情况下它都不会返回任何内容,这意味着它的值为None。将参数传递给空func()是徒劳的。您的假设是正确的,这不是创建MyClass的另一个实例的Pythonic方法。

如果您想创建MyClass的新实例,请执行以下操作:

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

阅读有关类对象及其实例化here的更多信息。

答案 1 :(得分: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(...)

答案 2 :(得分: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包中,您可以通过执行DateFramepandas.DataFrame.from_csv(...)等操作来创建pandas.DataFrame.from_json(...)对象。其中每一个都是返回DataFrame对象的类方法,使用不同的初始数据集(csv文本文件或JSON文本文件)创建。

例如,您可以将其称为:

my_new_object = myClass.from_fancy("hello world")

@classmethod here

上有一个好主题