Skip to main content
 首页 » 编程设计

python之在 Python 中将有状态对象和无状态计算之间的分隔放在哪里

2025年05月04日14mfryf

以下哪个代码片段最“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 

或

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) 

或

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 

请您参考如下方法:

如所写,A,远射。问题很简单,就是

Flat is better than nested.

你看:状态和计算分离是一个很好的设计原则,但它并不代表你的想法,至少不是我从这个例子中可以推断出你的想法。如果该状态不会在下一次计算中重新初始化,我们要确保状态不会改变以便完成计算。如果状态对于某些特定的计算是只读的,那么就没有风格上的强制性要求围绕它进行重定向,这样您就不会直接读取它。也就是说,除非计算 和 状态足够复杂以至于需要单独的单元测试。然后,无论如何,B 或 C 将是首选,但只有当为 u 创建值真的比实例化 A 的新实例更容易时>。