原文: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(类方法)实例方法的联系和区别的更多相关文章

  1. python中@staticmethod、@classmethod和实例方法

    1.形式上的异同点: 在形式上,Python中:实例方法必须有self,类方法用@classmethod装饰必须有cls,静态方法用@staticmethod装饰不必加cls或self,如下代码所示: ...

  2. python中 staticmethod与classmethod

    原文地址https://blog.csdn.net/youngbit007/article/details/68957848 原文地址https://blog.csdn.net/weixin_3565 ...

  3. 基于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 ...

  4. python中的静态方法和类方法

    在python中,各种方法的定义如下所示: class MyClass(object): #在类中定义普通方法,在定义普通方法的时候,必须添加self def foo(self,x): print & ...

  5. python中的静态方法、类方法、属性方法(福利:关于几种方法更好的解释)

    该部分的三个属性都是高级方法,平时用的地方不是很多 一.静态方法 静态方法的使用不是很多,可以理解的就看一下,用的地方不是很多 class Dog(object): def __init__(self ...

  6. python中@staticmethod与@classmethod

    @ 首先这里介绍一下‘@’的作用,‘@’用作函数的修饰符,是python2.4新增的功能,修饰符必须出现在函数定义前一行,不允许和函数定义在同一行.只可以对模块或者类定义的函数进行修饰,不允许修饰一个 ...

  7. 【代码学习】PYTHON中的静态方法和类方法

    一.类方法 是类对象所拥有的方法,需要用修饰器@classmethod来标识其为类方法,对于类方法,第一个参数必须是类对象,一般以cls作为第一个参数(当然可以用其他名称的变量作为其第一个参数,但是大 ...

  8. python中 staticmethod与classmethod区别

    staticmethod与classmethod区别 参考 https://stackoverflow.com/questions/136097/what-is-the-difference-betw ...

  9. 面试题:python 中 staticmethod 和 classmethod有什么区别

    面试中经常会问到staticmethod 和 classmethod有什么区别? 首先看下官方的解释: staticmethod: class staticmethod staticmethod(fu ...

随机推荐

  1. netfilter框架和iptables

    转载自:http://blog.chinaunix.net/uid-23069658-id-3160506.html http://blog.chinaunix.net/uid-23069658-id ...

  2. IntelliJ IDEA 2017版 spring-boot2.0.2 搭建 JPA springboot DataSource JPA环境搭建,JPA实现非字符型设置长度

    1.在github上已有配置环境,如下链接,(需要环境JDK1.8及以上版本,Tomcat1.8及以上版本,搭建maven库,使用编译器IntellJ IDEA) https://github.com ...

  3. DOM3级的变化

    由于存在跨浏览器开发问题所以不推荐使用: 兼容性: event.key 包含所按下键的字符 event.char 属性IE9和safari和chrome并不支持 event.location 返回所按 ...

  4. 学以致用十七-----shell脚本之比较数字和字符串及if else

    非常需要注意的是shell脚本对空格要求非常严格, 如: 比较字符串   (不能用于比较字符串) 以上这种写法会报错 因此比较字符串不用 单中括号 [ ] -----------------有误 而是 ...

  5. java混淆代码的使用

    前言:为了保护我们的劳动成果,我们来学习java混淆代码工具的使用. 1.下载retroguard.jar 进入http://www.retrologic.com/retroguard-downloa ...

  6. WORD文档中插入页码的问题

    原文链接:http://www.360doc.com/content/11/0216/15/849254_93539436.shtml 一.页码从第二页开始1.选择“插入-页码”,打开“页码”对话框. ...

  7. 【repost】DOM CRUD

    //DOM 的 CRUD // c 创建create // 1.直接往body中动态的添加标签(可以是任意类型)document.write('helloWorld');document.write( ...

  8. kafka讲解

    转载http://www.jasongj.com/2015/01/02/Kafka深度解析 Kafka是Apache下的一个子项目,是一个高性能跨语言分布式发布/订阅消息队列系统,而Jafka是在Ka ...

  9. handsontable 排序问题

    排序是表格的基础功能,handsontable也会支持. 有时需求会很复杂,需要自定义排序,或者调用其他排序方法:自定义排序,比较复杂,没做过:今天要用的是调用R中的排序方法. 有两个事件before ...

  10. hive 动态分区与混合分区

    hive的分区概念,相信大家都非常了解了.通过将数据放在hdfs不同的文件目录下,查表时,只扫描对应分区下的数据,避免了全表扫描. 提升了查询效率. 关于hive分区,我们还会用到多级分区.动态分区. ...