我正在清理python对象类,主要关注如何创建对象。 __init__
方法创建一个空字典,需要几乎立即填充。但这不应该在__init__
内发生,因为使用的方法会有很大差异。这是一个例子:
class Storage:
def __init__(self):
self.data = {}
def fill_1(self):
self.data['solo'] = 'all alone'
def fill_2(self, buddy, bff):
self.data['buddy'] = buddy
self.data['bff'] = bff
def fill_3(self, that_guy, house):
self.data[that_guy] = house
通常情况下,我可以像这样一个接一个地打电话:
box = Storage.Storage()
box.fill_1()
然而,当我按顺序创建许多这些对象时,这可能是压倒性的。我的目标是在同一行使用__init__
方法和fill
方法之一。我尝试过使用以下电话:
box = Storage.Storage().fill_1()
但是这不会创建对象而是返回None
。所以我有两个问题:
我的代码是否返回无对象,因为该行正在调用实例方法?
如何创建Storage
对象,然后在同一行内调用它的fill
方法?
答案 0 :(得分:5)
这不是你经常在python中看到的习惯用法(虽然它在许多其他语言中非常流行,尤其是javascript),但你可以通过从mutator函数返回self
来做到这一点。 (看起来你错过了实例方法的self
参数)。这意味着你也可以链接mutator调用 - Storage().fill_1().fill_2()
class Storage(object):
def __init__(self):
super(Storage, self).__init__()
data = {}
def fill_1(self):
data['solo'] = 'all alone'
return self
def fill_2(self, buddy, bff):
data['buddy'] = buddy
data['bff'] = bff
return self
def fill_3(self, that_guy, house):
data[that_guy] = house
return self
box = Storage().fill_1()
答案 1 :(得分:3)
制作备用构造函数:
class Storage(object):
def __init__(self):
self.data = {}
@staticmethod
def filled_1():
obj = Storage()
obj.data['solo'] = 'all alone'
return obj
@staticmethod
def filled_2(self, buddy, bff):
obj = Storage()
obj.data['buddy'] = buddy
obj.data['bff'] = bff
return obj
@staticmethod
def filled_3(self, that_guy, house):
obj = Storage()
obj.data[that_guy] = house
return obj
然后您不必担心单独的创建和初始化调用,或者使用调用链接混淆命令查询:
obj1 = Storage.filled_1()
obj2 = Storage.filled_2('Jenny', 'Joe')
...