使用具有初始化程序的对象方法(相同行)

时间:2016-04-07 18:08:10

标签: python python-2.7 object initialization

我正在清理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方法?

2 个答案:

答案 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')
...