【问题标题】:How to return a class instance in member function of a class?如何在类的成员函数中返回类实例?
【发布时间】:2016-08-09 01:12:52
【问题描述】:

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

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

我想我可以在func() 中调用__init__(),并返回一个新的MyClass 实例,但我不认为这是一种Pythonic 方式。我该怎么做?谢谢!

【问题讨论】:

    标签: python-2.7 function class instance return-type


    【解决方案1】:

    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】:

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

      如果您想创建MyClass 的新实例,只需这样做:

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

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

      【讨论】:

        【解决方案3】:

        如果我没看错你的问题,我觉得你应该为此使用 @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 上有一个好帖子

        【讨论】:

        • 不必要,@classicmethod 中的魔法会处理它,至少在 python 2.x 中。不了解python 3.x
        • @AlexanderYau 你什么都不做。只需使用那里的代码。没有其他的。欢迎使用 python 的简单性,你必须习惯它。
        • @AlexanderYau 确保你真的需要这个:你不能扩展__init__吗?在 python 中创建对象的正确方法是使用__init__。 python中的所有方法都是公开的
        • 谢谢,@classmethod 工作正常。还有一个问题,@classmethod 中可以使用实例属性吗?
        • 不确定您的意思?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多