程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长

+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

暂无数据

@staticmethod和@classmethod有什么区别?

发布于2019-08-19 21:53     阅读(2268)     评论(0)     点赞(8)     收藏(1)


装饰的功能@staticmethod和装饰的功能有什么区别@classmethod


解决方案


也许一些示例代码会有所帮助:注意调用签名的区别fooclass_foo并且static_foo

class A(object):
    def foo(self, x):
        print "executing foo(%s, %s)" % (self, x)

    @classmethod
    def class_foo(cls, x):
        print "executing class_foo(%s, %s)" % (cls, x)

    @staticmethod
    def static_foo(x):
        print "executing static_foo(%s)" % x    

a = A()

下面是对象实例调用方法的常用方法。对象实例a隐式传递为第一个参数。

a.foo(1)
# executing foo(<__main__.A object at 0xb7dbef0c>,1)

对于classmethods,对象实例的类隐式传递为第一个参数而不是self

a.class_foo(1)
# executing class_foo(<class '__main__.A'>,1)

您也可以class_foo使用该课程进行呼叫实际上,如果你将某些东西定义为类方法,那可能是因为你打算从类而不是类实例中调用它。A.foo(1)会产生一个TypeError,但A.class_foo(1)工作得很好:

A.class_foo(1)
# executing class_foo(<class '__main__.A'>,1)

人们发现类方法的一个用途是创建可继承的替代构造函数


使用staticmethods时self(对象实例)和cls(类)都不会 作为第一个参数隐式传递。它们的行为类似于普通函数,除了您可以从实例或类中调用它们:

a.static_foo(1)
# executing static_foo(1)

A.static_foo('hi')
# executing static_foo(hi)

Staticmethods用于将与类具有某种逻辑连接的函数分组到类中。


foo只是一个函数,但是当你调用时a.foo不仅仅是获取函数,你得到函数的“部分应用”版本,并将对象实例a绑定为函数的第一个参数。foo期望2个参数,而a.foo只需要1个参数。

a必然会foo这就是下面“绑定”一词的含义:

print(a.foo)
# <bound method A.foo of <__main__.A object at 0xb7d52f0c>>

a.class_fooa不是必然的class_foo,而是类A必然class_foo

print(a.class_foo)
# <bound method type.class_foo of <class '__main__.A'>>

在这里,使用static方法,即使它是一个方法,a.static_foo只返回一个没有参数绑定的良好'ole函数。static_foo期望1个参数,并且也 a.static_foo期望1个参数。

print(a.static_foo)
# <function static_foo at 0xb7d479cc>

当然,当您static_foo与班级打电话时会发生同样的事情A

print(A.static_foo)
# <function static_foo at 0xb7d479cc>


所属网站分类: 技术文章 > 问答

作者:黑洞官方问答小能手

链接:https://www.pythonheidong.com/blog/article/48899/4efa23751ead42588e10/

来源:python黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

8 0
收藏该文
已收藏

评论内容:(最多支持255个字符)