如果我有这些课程:
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
答案 0 :(得分:2)
您有一个课程MyObject
。如果要在单个调用中实例化MyObject
,则根本不需要构建器,只需直接初始化MyObject
:
versioned_obj = MyObject('0.0.1')
回到您的问题,使用Builder
类而不调用build()
:虽然可以通过覆盖{{ 1}}我真的不推荐。
在不理解为什么有一个生成器类的情况下(似乎什么也没做),很难推荐替代方法,但是肯定有一些替代方法。我不能根据您显示的代码推荐其中任何一种,因为它们无缘无故增加了复杂性。但是也许他们会给您一个适合您未显示的代码的想法。
在上面的示例中,没有明显的理由需要构建器,更不用说是一个类了,但是如果您想要一个构建器而不必是一个类,那么它可以简单地是一个函数:
MyObject
或者,如果Builder类确实适合作为一个类,而您只是没有向我们展示原因,则可以向该构建器添加一个工厂方法:
__new__
如果您不想修改构建器类,但是想要一个调用:
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__