(转)关于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 ...
随机推荐
- 学习fortran77基础语法
Program ParamaterDefine Implicit None C FORTRAN变量名和关键字不区分大小写.但调用外部函数的话,需要在编译选项里指定 c 大小写等选项 因为链接器是区分大 ...
- Linux下通过管道杀死所有与tomcat相关的进程
先将正确的命令放上来: ps -ef | grep ps -ef将系统中运行的进程展示出来 选择带有tomcat的进程后同时去除自身带有grep的进程,毕竟本身运行的这条命令是与tomcat相关的 a ...
- Vsftpd完全攻略(三)基于系统用户支持ftp上传 访问和vsftp安全设置
原文链接:http://viong.blog.51cto.com/844766/261342 1.关闭匿名用户登录 ftp支持匿名登录是不安全,所以要禁止匿名ftp登录 在/etc/vsftpd/vs ...
- LINQ 语法
语言集成查询 (LINQ) 是 Visual Studio 2008 和 .NET Framework 3.5 版中一项突破性的创新,它在对象领域和数据领域之间架起了一座桥梁. 传统上,针对数据的查询 ...
- Redis集群命令行部署工具
使用之前准备工作: 1)配置好与端口无关的公共redis.conf文件,和工具放在同一目录下 2)配置好与端口相关的模板redis-PORT.conf文件,也和工具放在同一目录下(部署时PORT会被替 ...
- Fortran编译器之一GUN Fortran安装(Windows XP)
最近研究GIS算法,需要用到Fortran语言.在网上找了一下发现一个开源的软件GUN Fortran编译器.当然既然是编译器,就是编译出程序的,但是编辑器不包括在内.编辑器可以用Text记事本,或者 ...
- 【python-ini】python读写ini文件
[python-ini]python读写ini文件 本文实例讲述了Python读写ini文件的方法.分享给大家供大家参考.具体如下: 比如有一个文件update.ini,里面有这些内容: 1 2 ...
- Hdu2819 Swap
Swap Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submi ...
- WP8整合Bing应用,生活有求Bing
在Windows 8中,Bing应用一直随系统而存在,提供多样化的资讯.它们是我的“御用”App,因为可以根据我的使用习惯对应用进行定制. 在Windows Phone 8系统第三次官方更新之后, B ...
- CAP 理论
CAP理论被很多人拿来作为分布式系统设计的金律,然而感觉大家对CAP这三个属性的认识却存在不少误区.从CAP的证明中可以看出来,这个理论的成立是需要很明确的对C.A.P三个概念进行界定的前提下的.在本 ...