小编典典

python类设计(staticmethod与方法)

python

对于不需要传递任何信息的方法(对象实例或类),更好的方法是什么,因为例如它们只需进行简单的转换即可。 @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

阅读 213

收藏
2021-01-20

共1个答案

小编典典

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

你有两种情况。第一种情况是该方法必须是类接口的一部分-
例如它必须由用户调用,或者必须在子类中可重写,或者它使用自身的信息,或者可能在将来的版本中您可能需要其中的任何软件。

在第一种情况下,您通常会使用普通方法(即方法与实例相关而不与类相关)或classmethod(当方法与类相关时(例如,它是替代构造函数),发现方法类功能等)。在这两种情况下,staticmethod如果方法没有使用来自类/实例的信息,则可以使用a
,但是这样做不会带来任何好处。而且这也将破坏您的工作能力,而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

这使您更好地了解这些对象在阅读源代码时会做什么,甚至还可以添加文档。但是,当您动态构建类或将它们添加到元类中时,它可能仍然派上用场(手动创建包装方法不是很方便)。

2021-01-20