在python中实例化类后如何直接返回对象?

时间:2018-11-26 16:18:53

标签: python class

如果我有这些课程:

class MyObject:
    def __init__(self, version):
        self.version = version

class Builder:
    def __init__(self,version='0.0.1'):
        self.version = version

    def build(self):
        return MyObject(self.version)

是否可以通过简单地调用

来获得返回的对象
versioned_obj = Builder('0.0.1') 
#instead of going through
builder = Builder('0.0.1')
versioned_object = builder.build()

尝试使用__init__(),但必须返回None

2 个答案:

答案 0 :(得分:2)

您有一个课程MyObject。如果要在单个调用中实例化MyObject,则根本不需要构建器,只需直接初始化MyObject

versioned_obj = MyObject('0.0.1')

回到您的问题,使用Builder类而不调用build():虽然可以通过覆盖{{ 1}}我真的不推荐。

在不理解为什么有一个生成器类的情况下(似乎什么也没做),很难推荐替代方法,但是肯定有一些替代方法。我不能根据您显示的代码推荐其中任何一种,因为它们无缘无故增加了复杂性。但是也许他们会给您一个适合您未显示的代码的想法。

Builder as Function

在上面的示例中,没有明显的理由需要构建器,更不用说是一个类了,但是如果您想要一个构建器而不必是一个类,那么它可以简单地是一个函数:

MyObject

Builder Factory方法

或者,如果Builder类确实适合作为一个类,而您只是没有向我们展示原因,则可以向该构建器添加一个工厂方法:

__new__

使用Builder的功能

如果您不想修改构建器类,但是想要一个调用:

def build_myobj(version):
    return MyObject(version)

versioned_obj = build_myobj('0.0.1')

答案 1 :(得分:1)

您似乎要指的是object.__new__方法。创建类的实例时,将调用__new__方法来创建并实际返回将要分配的对象,然后在分配之前调用它的__init__方法。

示例

class otherclass:
    def __init__(self, *args, **kwargs):
        print('hello from otherclass')

class myclass:
    # __new__ is a staticmethod by default so it recieves cls rather than self (no self exists yet..)
    def __new__(cls, *args, **kwargs):
        print('creating new instance of otherclass from myclass')
        return otherclass(*args, **kwargs)

呼叫myclass()打印:

creating new instance of otherclass from myclass 
hello from otherclass
Out[2]: <__main__.otherclass at 0x22192e0a898>

注意:我没有在示例中包括它,但是__init__的调用与*args, **kwargs的调用__new__