对于不需要传递任何信息的方法(对象实例或类),更好的方法是什么,因为例如它们只需进行简单的转换即可。 @staticmethod 或 方法 ?
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
方法类型的选择取决于其他因素。
你有两种情况。第一种情况是该方法必须是类接口的一部分- 例如它必须由用户调用,或者必须在子类中可重写,或者它使用自身的信息,或者可能在将来的版本中您可能需要其中的任何软件。
在第一种情况下,您通常会使用普通方法(即方法与实例相关而不与类相关)或classmethod(当方法与类相关时(例如,它是替代构造函数),发现方法类功能等)。在这两种情况下,staticmethod如果方法没有使用来自类/实例的信息,则可以使用a ,但是这样做不会带来任何好处。而且这也将破坏您的工作能力,而cls.method(instance, *args)这已经是一无所获。
classmethod
staticmethod
cls.method(instance, *args)
第二种情况是该方法无论如何都不是类的一部分。那么通常建议使用一个函数- 该方法并不是接口的真正组成部分,因此它在那里没有位置。除非您想在子类中覆盖树/货币计算器,否则您的示例似乎就是这种情况,但这在很大程度上取决于您对其进行的操作。
私有方法是一个特殊的情况- 即使您的方法与类没有真正的关系,您也可能想使用它,私有方法不是接口的一部分,因此放置它们的位置无关紧要。使用staticmethod静止不会带来很多好处,但是也没有任何理由不使用它。
实际上,有一种情况staticmethod非常有用-在类中添加外部函数(或其他对象)时。
class Foo(object): trees2money = staticmethod(calculators.trees2money) foo = staticmethod(calculators.bar)
但是,当您有一个静态的类定义时,这并不是很好,因为您始终可以执行以下操作。
class Foo(object): def trees2money(self, trees): """Calculator for trees2money, you can override when subclassing""" return calculators.trees2money(trees) @property def foo(self): """The foo of the object""" return calculators.bar
这使您更好地了解这些对象在阅读源代码时会做什么,甚至还可以添加文档。但是,当您动态构建类或将它们添加到元类中时,它可能仍然派上用场(手动创建包装方法不是很方便)。