(转)关于python3中staticmethod(静态方法)classmethod(类方法)实例方法的联系和区别
原文:http://dmcoders.com/2017/08/30/pythonclass/
https://zhuanlan.zhihu.com/p/28010894------正确理解Python中的 @staticmethod@classmethod方法
https://blog.csdn.net/jypfhx/article/details/75045471---python学习系列---staticmethod和classmethod
突然发觉自己好几天没写东西了,除了晚上加班,周末还得陪儿子好好玩耍,可能不小心又会荒废了自己的学习念头。
这阵子研究scrapy爬虫,涉及到了类的很多知识,其中关于类方法、静态方法、实例方法的区别和联系就是很有意思的一个方面~~
我从数据挖掘角度来看,python的类是数据集的特征属性集,而实例则是每个数据样本!
下面就这些内容,参考了网友和自己的学习体会,重新编写了一个案例,简单明了的案例
类变量
1、属于整个类,隐藏在类内部,对外不随意使用
2、用于整个类的内部调用,非某个方法专属
class Expclass():
cls_a = '类变量'
实例变量
1、属于类的实例化,对外提供使用
2、被实例对象调用或修改
class Expclass():
def __inif__(self):
self.a = '实例变量'
self和cls的概念和区别
1、self:在python中通常代表实例对象本身,作为定义实例方法的隐参数
2、cls:在python中通常代表类本身,用于定义类方法的隐参数
classmethod的概念和特点
1、定义形式:@classmethod,将一个方法定义为类方法
2、可访问类变量,形式如cls.类变量,属于软编码
3、不能访问实例变量
staticmethod的概念和特点
1、定义形式:@staticmethod,将一个方法定义为静态方法
2、可访问类变量,形式如类名.类变量,属于硬编码
3、不能访问实例变量
'''定义个例子'''
class Expclass():
#定义:类变量
cls_a = '类变量'
#定义:实例变量
def __init__(self):
self.a = '实例变量'
#定义:类方法,使用隐参cls,代表类本身
@classmethod
def classdef(cls,text):
c = text.split('-')
print('--类方法--')
print(c)
print(cls.cls_a) #此处软编码调用类变量:cls.类变量
print(cls.a) #此处报错,类方法无法调用实例变量!!
#定义:静态方法
@staticmethod
def staticdef(text):
c = text.split('-')
print('--静态方法--')
print(c)
print(Expclass.cls_a) #此处硬编码调用类变量:类名.类变量
print(self.a) #此处报错,静态方法无法调用实例变量!!
#定义:实例方法,使用隐参self,代表实例本身
def objectdef(self,text):
c = text.split('-')
print('--实例方法--')
print(c)
print(self.cls_a) #此处实例调用类变量:self.类变量
print(self.a) #此处实例调用实例变量:self.实例变量
'''实际测试:方法实例化'''
demo = Expclass()
'''直接调用类方法'''
Expclass.classdef('测试-文本')
--类方法--
['测试', '文本']
类变量
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-6-aac421d3fac5> in <module>()
1 '''直接调用类方法'''
----> 2 Expclass.classdef('测试-文本')
<ipython-input-1-865ab624379a> in classdef(cls, text)
14 print(c)
15 print(cls.cls_a) #此处软编码调用类变量:cls.类变量
---> 16 print(cls.a) #此处报错,类方法无法调用实例变量!!
17 #定义:静态方法
18 @staticmethod
AttributeError: type object 'Expclass' has no attribute 'a'
'''实例化调用类方法'''
demo.classdef('测试-文本')
--类方法--
['测试', '文本']
类变量
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-7-c129a55a8f9f> in <module>()
1 '''实例化调用类方法'''
----> 2 demo.classdef('测试-文本')
<ipython-input-1-865ab624379a> in classdef(cls, text)
14 print(c)
15 print(cls.cls_a) #此处软编码调用类变量:cls.类变量
---> 16 print(cls.a) #此处报错,类方法无法调用实例变量!!
17 #定义:静态方法
18 @staticmethod
AttributeError: type object 'Expclass' has no attribute 'a'
'''直接调用静态方法'''
Expclass.staticdef('测试-文本')
--静态方法--
['测试', '文本']
类变量
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-9-ce18ad6012cc> in <module>()
1 '''直接调用静态方法'''
----> 2 Expclass.staticdef('测试-文本')
<ipython-input-1-865ab624379a> in staticdef(text)
22 print(c)
23 print(Expclass.cls_a) #此处硬编码调用类变量:类名.类变量
---> 24 print(self.a) #此处报错,静态方法无法调用实例变量!!
25 #定义:实例方法,使用隐参self,代表实例本身
26 def objectdef(self,text):
NameError: name 'self' is not defined
'''实例化调用静态方法'''
demo.staticdef('测试-文本')
--静态方法--
['测试', '文本']
类变量
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-10-9106ff871328> in <module>()
1 '''实例化调用静态方法'''
----> 2 demo.staticdef('测试-文本')
<ipython-input-1-865ab624379a> in staticdef(text)
22 print(c)
23 print(Expclass.cls_a) #此处硬编码调用类变量:类名.类变量
---> 24 print(self.a) #此处报错,静态方法无法调用实例变量!!
25 #定义:实例方法,使用隐参self,代表实例本身
26 def objectdef(self,text):
NameError: name 'self' is not defined
'''直接调用实例方法'''
Expclass.objectdef('测试-文本')
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-11-17fb96aec4c8> in <module>()
1 '''直接调用实例方法'''
----> 2 Expclass.objectdef('测试-文本')
TypeError: objectdef() missing 1 required positional argument: 'text'
'''实例化调用实例方法'''
demo.objectdef('测试-文本')
--实例方法--
['测试', '文本']
类变量
实例变量
总结
1、类方法和静态方法均可访问类变量,形式不同。都不能访问实例变量
2、实例方法也可访问类变量,在变量名称相同时,它存在优先选择顺序即:实例变量>类变量>父类变量
(转)关于python3中staticmethod(静态方法)classmethod(类方法)实例方法的联系和区别的更多相关文章
- 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的区别(详解)
例子 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 class A(object): def foo(self,x): print "executing foo ...
- python中的静态方法和类方法
在python中,各种方法的定义如下所示: class MyClass(object): #在类中定义普通方法,在定义普通方法的时候,必须添加self def foo(self,x): print & ...
- python中的静态方法、类方法、属性方法(福利:关于几种方法更好的解释)
该部分的三个属性都是高级方法,平时用的地方不是很多 一.静态方法 静态方法的使用不是很多,可以理解的就看一下,用的地方不是很多 class Dog(object): def __init__(self ...
- python中@staticmethod与@classmethod
@ 首先这里介绍一下‘@’的作用,‘@’用作函数的修饰符,是python2.4新增的功能,修饰符必须出现在函数定义前一行,不允许和函数定义在同一行.只可以对模块或者类定义的函数进行修饰,不允许修饰一个 ...
- 【代码学习】PYTHON中的静态方法和类方法
一.类方法 是类对象所拥有的方法,需要用修饰器@classmethod来标识其为类方法,对于类方法,第一个参数必须是类对象,一般以cls作为第一个参数(当然可以用其他名称的变量作为其第一个参数,但是大 ...
- python中 staticmethod与classmethod区别
staticmethod与classmethod区别 参考 https://stackoverflow.com/questions/136097/what-is-the-difference-betw ...
- 面试题:python 中 staticmethod 和 classmethod有什么区别
面试中经常会问到staticmethod 和 classmethod有什么区别? 首先看下官方的解释: staticmethod: class staticmethod staticmethod(fu ...
随机推荐
- netfilter框架和iptables
转载自:http://blog.chinaunix.net/uid-23069658-id-3160506.html http://blog.chinaunix.net/uid-23069658-id ...
- IntelliJ IDEA 2017版 spring-boot2.0.2 搭建 JPA springboot DataSource JPA环境搭建,JPA实现非字符型设置长度
1.在github上已有配置环境,如下链接,(需要环境JDK1.8及以上版本,Tomcat1.8及以上版本,搭建maven库,使用编译器IntellJ IDEA) https://github.com ...
- DOM3级的变化
由于存在跨浏览器开发问题所以不推荐使用: 兼容性: event.key 包含所按下键的字符 event.char 属性IE9和safari和chrome并不支持 event.location 返回所按 ...
- 学以致用十七-----shell脚本之比较数字和字符串及if else
非常需要注意的是shell脚本对空格要求非常严格, 如: 比较字符串 (不能用于比较字符串) 以上这种写法会报错 因此比较字符串不用 单中括号 [ ] -----------------有误 而是 ...
- java混淆代码的使用
前言:为了保护我们的劳动成果,我们来学习java混淆代码工具的使用. 1.下载retroguard.jar 进入http://www.retrologic.com/retroguard-downloa ...
- WORD文档中插入页码的问题
原文链接:http://www.360doc.com/content/11/0216/15/849254_93539436.shtml 一.页码从第二页开始1.选择“插入-页码”,打开“页码”对话框. ...
- 【repost】DOM CRUD
//DOM 的 CRUD // c 创建create // 1.直接往body中动态的添加标签(可以是任意类型)document.write('helloWorld');document.write( ...
- kafka讲解
转载http://www.jasongj.com/2015/01/02/Kafka深度解析 Kafka是Apache下的一个子项目,是一个高性能跨语言分布式发布/订阅消息队列系统,而Jafka是在Ka ...
- handsontable 排序问题
排序是表格的基础功能,handsontable也会支持. 有时需求会很复杂,需要自定义排序,或者调用其他排序方法:自定义排序,比较复杂,没做过:今天要用的是调用R中的排序方法. 有两个事件before ...
- hive 动态分区与混合分区
hive的分区概念,相信大家都非常了解了.通过将数据放在hdfs不同的文件目录下,查表时,只扫描对应分区下的数据,避免了全表扫描. 提升了查询效率. 关于hive分区,我们还会用到多级分区.动态分区. ...