Python类作为函数的集合

时间:2017-11-30 16:54:33

标签: python python-3.x inheritance

所以这是我目前面临的非常简化的情况。

我上课了。它做了很多事情,但我关心的主要事情是每个类成员当前接受静态函数库并使用该库执行命令列表。

class Example:
    def __init__(self, commands, library, data):
        self.commands = commands
        self.library = library
        self.data = data

    def execute(self):
        for command in self.commands:
            result = getattr(self.library, command)(self)
            self.data[result[0]] = result[1]

我希望能够切换出这些函数库。当前的问题是我正在构建的大多数库共享一些核心功能,其他功能不同或被覆盖。目前我正在使用一个类来表示这些库,因为类结构的自然继承为我处理了一切。

class Foo:
    static_variable = 4

    @staticmethod
    def method_a(foo):
        return 'z', foo.data['x'] + foo.data['y']

    @classmethod
    def method_b(cls, foo):
        return 'x', foo.data['x'] * cls.static_variable


class FooAlt1(Foo):
    @classmethod
    def method_b(foo):
        return 'y', cls.static_variable


class FooAlt2(FooAlt1):
    static_variable = 1   

以下是执行代码的示例。这非常简单,所以它可能无法完美理解我的观点。我尝试构建的实际代码确定了通过用户输入执行的命令,根据从数据库中获取的不断变化的环境变量运行的数据集,然后有一些逻辑将它们分配给正确的函数库将能够处理一切。

foo1 = Example(commands=['method_b', 'method_a'], library=Foo, data={'x': 3, 'y': 4})
foo2 = Example(commands=['method_b', 'method_a'], library=FooAlt1, data={'x': 3})
foo3 = Example(commands=['method_b', 'method_a'], library=FooAlt2, data={'x': 3})

foo1.execute()
foo2.execute()
foo3.execute()

print('RESULTS')
print('foo1: {}'.format(foo1.data))
print('foo2: {}'.format(foo2.data))
print('foo3: {}'.format(foo3.data))

# RESULTS
# foo1: {'z': 16, 'x': 12, 'y': 4}
# foo2: {'z': 15, 'x': 3, 'y': 12}
# foo3: {'z': 6, 'x': 3, 'y': 3}

这种方法对我来说效果很好,但感觉非常不同于pythonic,因为我主要使用类作为函数的存储容器。但是,我不能想到一个不使用类来实现它的好方法。类结构让我更容易更新(我只需要更改一个函数,并且继承该函数的所有内容也会受到影响),如果我正在创建一个扩展或修改现有库的备用库,我可以轻松地继承函数。 / p>

有没有更好的方法来实现我想要的结果,还是我坚持使用类?

0 个答案:

没有答案