Python中的函数封装效率

时间:2017-01-12 13:00:00

标签: python python-2.7

我有一大堆对象,我需要能够对每个对象做一些复杂的事情,所以我有一些相当长的功能。

一般情况下,将long函数放在实际用于(GreatObject,下面)的类中以进行正确的封装是否更好,或者将一个函数放入其中是否更有效率?集合类(GreatSet,它只有一个实例)?

class GreatSet(object):
    def __init__(self):
        self.great_set = [] # Will contain a lot of GreatObjects.

    def long_method(self, great_object): # Is this function better here?
        [Many lines of code]

class GreatObject(object):
    def __init__(self, params):
        self.params = params

    def.long_method(self): # Or here?
        [Many lines of code]

我正在使用Python 2.7。

1 个答案:

答案 0 :(得分:3)

在这两种情况下,long_method都属于它的类(每个类都有一个long_method函数,由所有实例共享),在这两种情况下查找obj.long_method将为每个查找创建一个新的Method实例,所以wrt /“效率”(无论它应该是什么意思)它都没有任何区别。此外,除非您需要最大的时间和空间表现 - 在这种情况下,较低级别的语言可能是最佳选择 - 您应该真正感受到更多关注正确的设计和可维护性,而不是最大的原始性能。

因此,如果long_method应该在GreatObject上工作,可能属于GreatObject但是则取决于这些类的相应责任,long_method实际执行的操作以及long_methodGreatObjectGreatSet所属的应用程序层。例如,如果GreatObjectGreatSet都属于域模型而long_method属于与演示相关的内容,那么显然long_method既不属于GreatObject也不属于{{1} }}

最后,正如PartialOrder在他的评论中提到的,“长”功能通常是代码/设计气味。有时函数必须“足够长”,因为它做了一些复杂的事情 - 即使这样你通常也可以将它重构为更小的函数(如果那些函数需要共享状态,最终会重构为不同类的方法) - 但通常是长函数意味着它只是在做太多事情。