【问题标题】:in python,what is the difference below, and which is better [duplicate]在python中,下面有什么区别,哪个更好[重复]
【发布时间】:2013-10-13 01:23:06
【问题描述】:

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

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

【问题讨论】:

标签: python


【解决方案1】:

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

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

【讨论】:

  • 因为它被称为self._make_attr,子类实际上可以覆盖Demo2 中的静态方法,就像它实际上可以覆盖Demo1 中的普通方法一样。不过,您可能是正确的,在基类中指出这是否是预期的更有意义。作为编码风格的另一个问题,如果期望在派生类中被覆盖,那么使用初始下划线命名函数可能是错误的,但这是项目/团队的约定问题。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-05-01
      • 2010-10-30
      • 2013-06-10
      • 1970-01-01
      • 2019-10-13
      • 1970-01-01
      • 2017-08-14
      相关资源
      最近更新 更多