来自@staticmethod的参考课程

时间:2014-01-29 11:31:36

标签: python class methods

↑↑↑它没有

假设我有一个带有一些实用方法的课程:

class Utils:
    @staticmethod
    def do_stuff():
        # some stuff
        Utils.do_other_stuff()
        # some more stuff

    @staticmethod
    def do_other_stuff():
        # somehting other

我真的不喜欢Utils.do_other_stuff()部分。

如果是实例方法,我会通过self引用它,但在这里我必须写出完整的类名。

这是@classmethod使用的好主意,还是过度杀伤? - 或者是否有一些更简洁的方法来编写Utils,可能还有一个模块?

3 个答案:

答案 0 :(得分:2)

如果您需要对当前类(可能是子类)的引用,那么一定要使它成为classmethod

这不是矫枉过正; Python对绑定类方法所做的工作量与静态方法或常规方法没什么区别。

但是,除非必须,否则不要在此使用课程。 Python不是Java,你不 使用类,函数可以在类之外生活。

答案 1 :(得分:1)

@classmethod是要走的路:

class Utils:
    @classmethod
    def do_stuff(cls):
        # some stuff
        cls.do_other_stuff()
        # some more stuff

    @classmethod
    def do_other_stuff(cls):
        # somehting other

只是澄清了与 Martijn Pieters 的评论:我通常会避免使用@staticmethod而我更喜欢采用@classmethod因为它允许我引用类及其方法。 (我不同意有关编写具有函数的模块的建议......我是OOP支持者:P)

答案 2 :(得分:1)

Utils看起来不会被子类化或实例化;它只是静态方法的包装器。在这种情况下,这些方法都可以转换为模块级函数,可能在单独的utils模块中:

# No class!
def do_stuff():
    ...
    do_other_stuff()
    ...

def do_other_stuff():
    ...