在python中,下面的区别是什么,哪个更好

本问题已经有最佳答案,请猛点这里访问。

我写过这样的代码,它们都对我有用,但是有什么区别呢?哪个更好?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Demo1(object):
    def __init__(self):
        self.attr = self._make_attr()
    def _make_attr(self):
        #skip...
        return attr

class Demo2(object):
    def __init__(self):
        self.attr = self._make_attr()
    @staticmethod
    def _make_attr():
        #skip...
        return attr


如果两者都在工作,这意味着在make_attr中您没有使用self

只有当代码在逻辑上依赖于实例,并且仅在当前实现中不依赖于实例时(例如,它可以依赖于派生自该类的类中的实例),使它成为常规的非静态方法才有意义。


在这两种方法中,attr都是一个局部变量,不依赖于类中的任何内容。结果是一样的。将它标记为静态可以让您了解这一点,并能够直接访问它,例如Demo2._make_attr(),而不需要创建类的实例。

如果希望它接受类变量,可以将其引用为self.attr。但是如果这样做,Demo2._make_attr()就不能再是静态的了。


说到功能,@staticmethod并不重要。它的值是语义的——您告诉自己或其他程序员,即使这个函数属于类的名称空间,它也不绑定到任何特定的实例。这种标记在重构代码或查找bug时非常有用。