python中@staticmethod与@classmethod
@
首先这里介绍一下‘@’的作用,‘@’用作函数的修饰符,是python2.4新增的功能,修饰符必须出现在函数定义前一行,不允许和函数定义在同一行。只可以对模块或者类定义的函数进行修饰,不允许修饰一个类。一个修饰也就是一个函数,它将被修饰的函数作为参数,并返回修饰后同名函数的调用。
#-*- coding:utf-8 -×- def fun(f):
print 'AAAA'
return f('BBBB') @fun
def fun_1(s):
print s def fun_2(s):
print s
fun(fun_2)
输出:
AAAA
BBBB
AAAA
BBBB
@staticmethod和@classmethod
python其实有3个方法,静态方法、类方法和实例方法如下:
#-*- coding:utf-8 -*-
def fun(x):
print "fun for %s"%x class A(object):
def fun(self,x):
print "fun for (%s,%s)"%(self,x) @classmethod
def class_fun(cls,x):
print "fun for (%s,%s)" % (cls, x) @staticmethod
def static_fun(x):
print "fun for %s" % x fun(1)
a=A()
a.fun(1)
a.class_fun(1)
a.static_fun(1) A().fun(1) #A.fun(1)是非法的
A.class_fun(1)
A.static_fun(1)
输出:
fun for 1
fun for (<__main__.A object at 0x7f40fd9c5ed0>,1)
fun for (<class '__main__.A'>,1)
fun for 1
fun for (<__main__.A object at 0x7f40fd9d4150>,1)
fun for (<class '__main__.A'>,1)
fun for 1
这里先理解一下参数中的self和cls,这里的self和cls是对类或者实例的绑定。对于一般的函数来说我们可以直接调用,例如‘fun(1)’,这也是最常见的,它的工作和任何的类、实例没有关系,但类里面定义的方法都需要绑定这个实例,比如‘fun(self,x)’,之所以这样做,是因为实例方法的调用离不开实例,我们需要把实例自己传给参数,调用的时候比如‘a.fun(1)’(其实是fun(a,1)),类的方法也是一样的,只不过它传递的是类而不是实例,比如‘A.class_fun(1)’,注意这里的self和cls可以换成别的参数,但是python约定就是这样。
实例方法 类方法 静态方法
a=A() a.fun(x) a.class_fun(x
A 不可用 A.class_fun
python中@staticmethod与@classmethod的更多相关文章
- 基于python中staticmethod和classmethod的区别(详解)
例子 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 class A(object): def foo(self,x): print "executing foo ...
- python中@staticmethod、@classmethod和实例方法
1.形式上的异同点: 在形式上,Python中:实例方法必须有self,类方法用@classmethod装饰必须有cls,静态方法用@staticmethod装饰不必加cls或self,如下代码所示: ...
- python中 staticmethod与classmethod
原文地址https://blog.csdn.net/youngbit007/article/details/68957848 原文地址https://blog.csdn.net/weixin_3565 ...
- 面试题:python 中 staticmethod 和 classmethod有什么区别
面试中经常会问到staticmethod 和 classmethod有什么区别? 首先看下官方的解释: staticmethod: class staticmethod staticmethod(fu ...
- python 中 staticmethod 和 classmethod有什么区别
面试中经常会问到staticmethod 和 classmethod有什么区别? 首先看下官方的解释: staticmethod: class staticmethod staticmethod(fu ...
- python中 staticmethod与classmethod区别
staticmethod与classmethod区别 参考 https://stackoverflow.com/questions/136097/what-is-the-difference-betw ...
- Python中@staticmethod和@classmethod的作用和区别
简单介绍一下两者的区别: 对于一般的函数test(x),它跟类和类的实例没有任何关系,直接调用test(x)即可 #!/usr/bin/python # -*- coding:utf-8 -*- de ...
- (转)关于python3中staticmethod(静态方法)classmethod(类方法)实例方法的联系和区别
原文:http://dmcoders.com/2017/08/30/pythonclass/ https://zhuanlan.zhihu.com/p/28010894------正确理解Python ...
- python 之@staticmethod和@classmethod
在python中,要调用一个类中的方法,一般的操作步骤如下: 1.实例化此类 2.调用此类中的方法 而@staticmethod和@classmethod则打破了这种引用方式,可以在不实例化类的情况下 ...
随机推荐
- idea intellij对Spring进行单元测试
1.加入Junit4及SpringJUnit4支持 <!-- junit --> <dependency> <groupId>junit</groupId&g ...
- 安卓hid驱动触摸屏
在kernel/drivers/hid/ 目录下三个文件中添加usbtouch的pid vid, 文件分别是hid-multitouch.c .hid-ids.h.hid-core.c 具体如何添加可 ...
- HDMI之(AVI)Auxiliary Video Information InfoFrame
这是HDMI协议中关于AVI接口的信息 AVI InfoFrame在H14b中进行了定义.从HDMI 2.0 10.1 Use of the AVI InfoFrame in This Spe ...
- 查看Redis集群所有节点内存工具
指定集群中任意一个节点,查看集群中所有节点当前已用物理内存.配置的最大物理内存和系统物理内存. 源码(可从https://github.com/eyjian/redis-tools下载): #! ...
- 1.6getId()方法
getId()方法的作用是取得线程的唯一标识. package com.cky.test; /** * Created by chenkaiyang on 2017/12/2. */ public c ...
- 20169207《Linux内核原理及分析》第十二周作业
本周选做的信息安全实验为Python实现Zip文件的暴力破解 实验预备: 这次实验我们需要用到的库为zipfile.下来我们先来了解一下这个模块. 首先我们的重点是对zip文件的操作,而zipfile ...
- 20169207 《Linux内核原理与分析》第十一周作业
阅读学习教材「Linux内核设计与实现 (Linux Kernel Development)」第教材第17,19,20章. 在第17章设备与模块章节,关于设备驱动和设备管理,我们讨论四中内核成分. 1 ...
- codeforces 982 c
给你一棵树 让你进行切割 问你最多能切多少刀 使得每个连通分量size都是偶数 思路:首先 要是有奇数个节点的话 那么不管你怎么切割 都会有一个连通分量的size是奇数 所以只有偶数的情况 ...
- 第三天:DOM操作css
基本语法: 引用样式时是在head中,用link,另外需要<div>才能显示 修改样式:按下按钮后,引用的样式部分,颜色变为蓝色 如图下图是更改了样式中hello的颜色 代码如下: < ...
- Windows10卡顿,磁盘 内存占用100%或比较多
1.关闭服务:Superfetch: 2.结束antimalware service executable进程,gpedit.msc下依次点击“计算机配置/管理模板/Windows组件/Windows ...