发布于2019-08-19 21:53 阅读(2406) 评论(0) 点赞(8) 收藏(1)
装饰的功能@staticmethod
和装饰的功能有什么区别@classmethod
?
也许一些示例代码会有所帮助:注意调用签名的区别foo
,class_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_foo
,a
不是必然的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黑洞网
任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任
昵称:
评论内容:(最多支持255个字符)
---无人问津也好,技不如人也罢,你都要试着安静下来,去做自己该做的事,而不是让内心的烦躁、焦虑,坏掉你本来就不多的热情和定力
Copyright © 2018-2021 python黑洞网 All Rights Reserved 版权所有,并保留所有权利。 京ICP备18063182号-1
投诉与举报,广告合作请联系vgs_info@163.com或QQ3083709327
免责声明:网站文章均由用户上传,仅供读者学习交流使用,禁止用做商业用途。若文章涉及色情,反动,侵权等违法信息,请向我们举报,一经核实我们会立即删除!