在Python中将有状态对象与无状态计算分开的位置?

Ric*_*ard 1 python

以下哪些代码片段最"pythonic"?在这个例子中计算是微不足道的,但可以假设在现实生活中是复杂的.

class A(object):
    """Freely mix state and calcs - no good I presume"""
    def __init__(self, state):
        self.state = state

    def calc_with_state(self, x):
        return (self.state + x)**2
Run Code Online (Sandbox Code Playgroud)

要么

class B(object):
    """Separate state from calc by a static method"""
    @staticmethod
    def inner_calc(u, v):
        return (u + v)**2

    def __init__(self, state):
        self.state = state

    def calc_with_state(self, x):
        return B.inner_calc(self.state, x)
Run Code Online (Sandbox Code Playgroud)

要么

class C(object):
    """Break out the calculation in a free function"""
    def __init__(self, state):
        self.state = state

    def calc_with_state(self, x):
        return outer_calc(self.state, x)

def outer_calc(u, v):
    return (u + v)**2
Run Code Online (Sandbox Code Playgroud)

Dav*_*ger 6

正如所写,A,由远景.这个问题非常简单

Flat优于嵌套.

看:将状态与计算分开是一个很好的设计原则,但它并不意味着你的想法,至少不是我能推断你从这个例子中想到的.我们希望确保状态不会改变,以便完成计算,如果该状态不会在下一次计算中重新初始化.如果状态对于某些特定计算是只读的,则没有风格强制重定向它,以便您不直接读取它.也就是说,除非计算状态足够复杂,需要单独的单元测试.然后,无论如何,B或C将是首选,但只有当它实际上更容易创建值而u不是实例化新的实例时A.