我写了这样的代码,它们都适合我,但有什么区别?哪个更好?
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
答案 0 :(得分:1)
如果两者都有效,则意味着你make_attr
内没有使用self
。
使它成为一个常规的非静态方法只有在代码可以在逻辑上依赖于实例并且在当前实现中偶然不依赖于它时才有意义(但是例如它可能依赖于派生类中的实例来自这个班级。)
答案 1 :(得分:0)
在功能方面,@ staticmethod并不重要。它的价值是语义的 - 你告诉自己或其他程序员,即使这个函数属于类的命名空间,它也不依赖于任何特定的实例。在重构代码或查找错误时,这种标记非常有用。
答案 2 :(得分:0)
在其中一个中,attr是一个局部变量,不依赖于类中的任何内容。结果是一样的。将其标记为静态可以让您了解这一点,并且能够直接访问它,例如Demo2._make_attr(),而无需创建类的实例和实例。
如果您希望它访问类变量,您可以将其引用为self.attr
。但如果你这样做,那么Demo2._make_attr()就不再是静态的了。