本问题已经有最佳答案,请猛点这里访问。
我写过这样的代码,它们都对我有用,但是有什么区别呢?哪个更好?
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 |
如果两者都在工作,这意味着在
只有当代码在逻辑上依赖于实例,并且仅在当前实现中不依赖于实例时(例如,它可以依赖于派生自该类的类中的实例),使它成为常规的非静态方法才有意义。
在这两种方法中,attr都是一个局部变量,不依赖于类中的任何内容。结果是一样的。将它标记为静态可以让您了解这一点,并能够直接访问它,例如Demo2._make_attr(),而不需要创建类的实例。
如果希望它接受类变量,可以将其引用为
说到功能,@staticmethod并不重要。它的值是语义的——您告诉自己或其他程序员,即使这个函数属于类的名称空间,它也不绑定到任何特定的实例。这种标记在重构代码或查找bug时非常有用。