我想在类的成员函数中返回一个类实例,我的代码是:
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方式。我该怎么办?谢谢!
答案 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
包中,您可以通过执行DateFrame
或pandas.DataFrame.from_csv(...)
等操作来创建pandas.DataFrame.from_json(...)
对象。其中每一个都是返回DataFrame
对象的类方法,使用不同的初始数据集(csv文本文件或JSON文本文件)创建。
例如,您可以将其称为:
my_new_object = myClass.from_fancy("hello world")
@classmethod
here