python类设计(staticmethod vs method)

2024-10-01 13:42:50 发布

您现在位置:Python中文网/ 问答频道 /正文

对于那些不需要任何传递信息的方法(对象实例或类),因为它们只需进行简单的转换,那么什么是更好的方法呢。@静态方法还是方法?在

class Foo(object):
    def __init__(self, trees):
        self.money = Foo.trees2money(trees)

    @staticmethod
    def trees2money(trees):
        return trees * 1.337

class Quu(object):
    def __init__(self, trees):
        self.money = self.trees2money(trees)

    def trees2money(self, trees):
        return trees * 1.337

Tags: 对象实例方法selfreturnobjectfooinit
3条回答

方法类型的选择取决于其他因素。在

你有两个案子。第一种情况是当方法必须是类接口的一部分时-例如,它必须由用户调用,或者必须在子类中重写,或者它在self中使用信息,或者在软件的未来版本中可能需要这些。在

在第一种情况下,您通常会使用普通方法(当方法与实例相关而不是与类相关时)或classmethod(当方法与类相关时,例如,它是一个替代构造函数,一种发现类特性的方法,等等)。在这两种情况下,如果方法没有使用来自类/实例的信息,但是这样做不会获得任何好处,那么可以使用staticmethod。而且这也会破坏你的能力,这已经是一无所有了。在

第二种情况是当方法无论如何都不是类的一部分时。然后通常建议使用一个函数-该方法并不是接口的一部分,因此它在那里没有位置。你的例子似乎就是这样,除非你想在子类中重写树/货币计算器,但这很大程度上取决于你用它做什么。在

如果你不想把方法放在一个不相关的类的特殊情况下,那么你可能不想把这些方法放在私有的地方。使用staticmethod仍然不会给你带来什么好处,但也没有理由不使用它。在

实际上有一种情况下,staticmethod非常有用——当你在类中放入外部函数(或其他对象)时。在

class Foo(object):
     trees2money = staticmethod(calculators.trees2money)
     foo = staticmethod(calculators.bar)

但是当你有一个类的静态定义时,这并不是很好,因为你总是可以做下面的事情。在

^{pr2}$

这样可以更好地了解这些对象在读取源代码时做什么,甚至允许您添加文档。但是,当您动态地构建类,或者将它们添加到元类中时(手动创建包装器方法不太方便),它可能仍然有用。在

任何不使用对象名称空间名称的方法都应该使用类方法,而那些不使用类名称空间名称的方法要么是staticmetdods,要么甚至作为函数放在模块级别。在

使用实际对象方法时,预期的行为是访问同一对象中的其他属性/方法。在

对于所有面向对象的设计,我的一般规则是,如果类没有状态,请考虑使用静态方法。如果类有状态,请使用实例方法-手动操作。在

此外,如果类确实没有状态,请思考几分钟,看看是否不能将静态行为移近数据,从而通过Extract Method重构消除这些静态方法。在

相关问题 更多 >