3

我写了这样的代码,它们都适合我,但有什么区别?哪个更好?

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
4

3 回答 3

1

如果两者都在工作,则意味着make_attr您没有在内部使用self.

使其成为常规的非静态方法只有在代码可以在逻辑上依赖于实例并且只是偶然在当前实现中不依赖于它时才有意义(但例如它可能依赖于从此类派生的类中的实例)。

于 2013-10-06T12:54:35.440 回答
0

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

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

于 2013-10-06T12:34:26.077 回答
0

在功能方面,@staticmethod 并不重要。它的价值是语义的——你是在告诉自己,或者其他编码人员,即使这个函数属于类的命名空间,它也不依赖于任何特定的实例。这种标记在重构代码或查找错误时非常有用。

于 2013-10-06T12:26:54.863 回答