粗解python的@classmethod和@staticmethod及普通实例方法
引言:
使用不同的函数定义方法,可以使得函数定义更加有效而且易于维护
本文为博主原创,根据本人自己的理解整理而成,若有不准确的地方,希望能留言告知以免误导他人;
首先进一段代码,来直观感受一下不同类型的函数的定义方法:
>>>
>>> class A(object):
a =
def instance_method(self):
print '实例方法打印类变量a: %s' % self.a
@classmethod
def class_method(cls):
print '类方法打印类变量a: %s' % cls.a
@staticmethod
def static_method(b):
print '静态方法打印自己的变量b: %s' % b
>>>
>>> A.instance_method()
Traceback (most recent call last):
File , in <module>
A.instance_method()
TypeError: unbound method instance_method() must be called with A instance as first argument (got nothing instead)
>>>
>>> A().instance_method()
实例方法打印类变量a:
>>>
>>> A.class_method()
类方法打印类变量a:
>>>
>>> A().class_method()
类方法打印类变量a:
>>>
>>> A.static_method()
静态方法打印自己的变量b:
>>>
>>> A().static_method()
静态方法打印自己的变量b:
>>>
>>>
解析一下以上代码:
1.实例方法instance_method()的定义不需要声明,默认需要一个self参数作为第一个参数;在调用的时候这个self参数指代实例对象;由代码中的调用方式可以看出,实例方法不能用类对象调用,也就是A.instance_method()调用会报错;但是可以用实例对象A().instance_method()调用;当然如果不明确,可以写成:
ins = A()
ins.instance_method()
2.类方法class_method()需要用装饰器@classmethod来声明,默认需要一个cls参数作为函数的第一个参数;在调用的时候这个cls参数指代类对象;这样定义的好处是不需要实例化类对象即可调用这个方法:A.instance_method();当然如果需要,类方法也可以通过实例对象调用:A().class_method();但是在大多别的变成语言中不允许实例对象调用类方法;类方法的调用在导入模块时能得到更好的体现:
import A
A.class_method()
3.静态方法static_method()需要用装饰器@staticmethod来声明,理解静态变量的最好方法是把静态方法拿到类的外面,或者说重新再类的外面定义一个相同的函数来对比两者的区别;其实静态变量就是在类中定义的跟这个类没有关系的方法,它不引用类的变量,也跟类中的其他函数没有关联,完全自己玩自己的,所以能够看到在代码中定义静态变量的时候给了它自己的一个函数变量b,而它打印的也是自己的变量b;但是既然定义在类中,就得通过类对象或者实例对象来调用;
另外,需要注意得是,实例方法和类方法中的self和cls这两个字符本身没有什么特殊,完全可以用别的字符如hello或者hi来代替,但是python中约定俗成默认用self和cls来作为实例方法和类方法的第一个参数,在调用方法时,self用来指代实例对象,cls用来指代类对象本身;静态方法因为本身与类中其他变量或者方法没有关联,所以不需要这样一个参数;
粗解python的@classmethod和@staticmethod及普通实例方法的更多相关文章
- python类方法@classmethod与@staticmethod
目录 python类方法@classmethod与@staticmethod 一.@classmethod 介绍 语法 举例 二.@staticmethod 介绍 语法 举例 python类方法@cl ...
- python的@classmethod和@staticmethod
本文是对StackOverflow上的一篇高赞回答的不完全翻译,原文链接:meaning-of-classmethod-and-staticmethod-for-beginner Python面向对象 ...
- Python中classmethod与staticmethod区别
classmethod:类方法staticmethod:静态方法 在python中,静态方法和类方法都是可以通过类对象和类对象实例访问.但是区别是: @classmethod 是一个函数修饰符,它表示 ...
- Python中classmethod和staticmethod的区别
学习python中经常会出现一些相近或者相似的语法模块等,需要对比分析才能加深记忆,熟练运用. staticmethod:静态方法 classmethod:类方法 在python中,静态方法和类方法都 ...
- Python的classmethod和staticmethod区别
静态方法(staticmethod) 类方法(classmethod) 静态方法和类方法都可以通过类名.方法名或者实例.方法访问. #-*- coding:utf8 -*- class A(objec ...
- python基础知识讲解——@classmethod和@staticmethod的作用
python基础知识讲解——@classmethod和@staticmethod的作用 在类的成员函数中,可以添加@classmethod和@staticmethod修饰符,这两者有一定的差异,简单来 ...
- @classmethod及@staticmethod方法浅析【python】
目前对于python中@classmethod 类方法和@staticmethod静态方法的有了一定的认识,之后有进一步的认识后继续记录. @classmethod :是和一个class类相关的方法, ...
- 洗礼灵魂,修炼python(47)--巩固篇—定义类的方法之@classmethod,@staticmethod
定义类的方法,相信你会说,不就是在class语句下使用def () 就是定义类的方法了嘛,是的,这是定义的方法的一种,而且是最普通的方式 首先,我们已经知道有两种方式: 1.普通方法: 1)与类无关的 ...
- python基础-abstractmethod、__属性、property、setter、deleter、classmethod、staticmethod
python基础-abstractmethod.__属性.property.setter.deleter.classmethod.staticmethod
随机推荐
- Win7不能用鼠标双击运行jar文件怎么办?
Java应用程序jar文件可以由 JVM(Java虚拟机)直接执行,只要操作系统安装了JVM便可以运行作为Java应用程序的jar文件,其跨平台特性使得很多工具软件都用jar方式来部署分发,比如用于H ...
- cf 557D 二分图黑白染色
题意:给出一个 n 点 m 边的图,问最少加多少边使其能够存在奇环,加最少边的情况数有多少种 奇环和偶环其实就是二分图的性质:二分图不存在奇环,所以只要判断这张图是否是二分图就行了: 如果本身就不是二 ...
- IntelliJ IDEA 2017激活
最新更新: 在激活Jetbrains旗下任意产品的时候选择激活服务器 填入以下地址便可成功激活 http://idea.liyang.io 点击help→Register→License sever ...
- benthos 通过rest api 配置 stream 说明
stream 模式,我们可以通过rest api 进行控制 使用方法 启动 benthos --streams 进行流的配置(rest api) curl http://localhost:4195/ ...
- About Apache Cordova
Apache Cordova is a set of device APIs that allow a mobile app developer to access native device fun ...
- ORA-01791: not a SELECTed expression
Student表有3个字段:id,name,age 看这两个SQL语句 (1)select name from student order by id; (2)select distinct(name ...
- 在CentOS和RHEL中配置SNMPv3
首先,使用yum安装必要的软件 [root@server ~]# yum install net-snmp-utils net-snmp-devel安装完成之后, 先停止snmpd,再创建具有只读属性 ...
- java 多线程之 interrupt()和线程终止方式
interrupt() 说明 interrupt()的作用是中断本线程. 本线程中断自己是被允许的:其它线程调用本线程的interrupt()方法时,会通过checkAccess()检查权限.这有可能 ...
- Open Flash Chart 之线图(二)
上一节在研究Open Flash Chart时,漏掉不少东西,只是简单的熟悉了一下后端的属性设置.今天再来补充一下. 一.显示Open Flash Chart图表 Open Flash Chart 前 ...
- 大数据工具篇之flume1.4-安装部署指南
一.引言 flume-ng是一个分布式.高可靠和高效的日志收集系统,flume-ng是flume的新版本的意思,其中“ng”意为new generate(新一代),目前来说,flume-ng 1.4是 ...