【问题标题】:All methods in python classes behaving like staticpython类中的所有方法都表现得像静态
【发布时间】:2019-08-06 06:51:08
【问题描述】:

最近我注意到一个新概念:python3 中的class function

(注意:不是问类方法,而是下一个代码中类似fun的类函数。)

class A:
    def fun():
        print("fun")

    @staticmethod
    def fun2():
        print("fun2")

A.fun()
A.fun2()

# updated
print(A.__dict__)
# {'__module__': '__main__', 'fun': <function A.fun at 0x0000014C658F30D0>, 'fun2': <staticmethod object at 0x0000014C658E1C50>, '__dict__': <attribute '__dict__' of 'A' objects>, '__weakref__': <attribute '__weakref__' of 'A' objects>, '__doc__': None}    

如果执行以上代码:

python2 输出:

Traceback(最近一次调用最后一次):文件“a.py”,第 9 行,在
A.fun() TypeError: unbound method fun() must be called with A instance as first argument (什么都没有)

python3 输出:

有趣
有趣2

而且,在python3中,它似乎被称为类函数,它不再是一个方法。

所以,我的问题是:为什么会发生这种变化?因为我们已经可以使用@staticmethod 在类中定义一些实用函数。

【问题讨论】:

  • 当然,我仍然可以使用静态方法,只是我怕我会错过一些新功能,就像关于“类方法和静态方法”比较的老问题一样。最后,我们都知道我们可以使用类方法来创建静态方法不能创建的工厂方法。那么现在这个比较如何呢?

标签: python python-3.x


【解决方案1】:

这是因为 python 3 类中的所有函数都默认具有静态行为。 Python 3 放弃了 unbound 方法的概念。可以使用类对象本身调用类的所有成员方法,就像您所做的那样。

因此,除了您的代码之外,此代码也是允许的:

class A:
    def func(self):
        print('Hello')

A.func(123)

这样做可能是为了方便,让您在某些情况下不必编写@staticmethod,还可以让您将实例方法与其他类型的对象重用,正如您在上面的 sn-p 中看到的那样。

函数没有显示为静态方法,因为它不是。正如@Aran-Fey 指出的那样,仍然可以在类的实例上调用无参数静态方法,这就是为什么我们在 Python 3 中有 @staticmethod

(请查看编辑历史以了解此答案的旧版本、不正确版本)

【讨论】:

  • 看起来很合理,但是看到更新,我打印了这个类的字典。如果只是为了方便,为什么fun 的类型不是staticmethod?你能分享一些我可以参考的链接来证明你的想法吗?
  • 已编辑:)。不幸的是,我找不到任何文档来支持这一点。
  • 默认情况下,python 3 类中的无参数函数不是staticmethods .. 你能包含一个代码示例来说明你的意思吗?
  • "如果没有指定 self 参数,它实际上使函数与静态方法相同。" False。 A().fun() 会抛出异常,但 A().fun2() 不会。 “由于向后兼容的原因,装饰器@staticmethod 可能没有被删除。” 又错了。它没有被删除,因为它有一个目的。
  • @Aran-Fey 但是@staticmethod 在 python3 中的作用是什么?是只允许通过类实例调用吗?
猜你喜欢
  • 2019-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多