我写过这样的代码,它们都是为我工作的,但有什么区别呢?哪个更好?在
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
。在只有当代码可以在逻辑上依赖于实例,并且在当前实现中偶然不依赖于实例时,使它成为常规的非静态方法才有意义(但例如,它可能依赖于从该类派生的类中的实例)。在
说到功能,@staticmethod并不重要。它的值是语义的-您告诉自己或其他编码人员,即使这个函数属于类的名称空间,它也没有绑定到任何特定的实例。这种标记在重构代码或查找bug时非常有用。在
在任何一种情况下,attr都是局部变量,不依赖于类中的任何内容。结果是一样的。将其标记为static可以让您了解这一点,并能够直接访问它,例如Demo2.\u make_attr(),而不必创建类和类的实例。在
如果希望它访问类变量,可以将其引用为
self.attr
。但是如果您这样做,那么Demo2.\u make_attr()就不能再是静态的了。在相关问题 更多 >
编程相关推荐