(转)关于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 ...
随机推荐
- openstack之镜像管理
概览 [root@cc07 fast-pulsar]# glance help | grep image [--os-image-url OS_IMAGE_URL] [--os-image-api-v ...
- C语言的问题,头文件:keil也许有漏洞
2018-06-15 16:52:03 ------------------------------------------------------------------------------ ...
- pat树之专题(30分)
(好好复习是王道) 1115. Counting Nodes in a BST (30) 分析:简单题——将bst树构造出来,然后给每个节点打上高度.最后求出树的高度.然后count树高的节点数加上树 ...
- hdu1176--免费馅饼(简单动态规划)
都说天上不会掉馅饼,但有一天gameboy正走在回家的小径上,忽然天上掉下大把大把的馅饼.说来gameboy的人品实在是太好了,这馅饼别处都不掉,就掉落在他身旁的10米范围内.馅饼如果掉在了地上当然就 ...
- SSM_CRUD新手练习(4)修改生成的mapper.xml映射文件
我们为什么要修改呢,这是因为我们查询的时候,我们有时候需要连表查询,例如我们需要查询出员工表的信息(emp_id,emp_name...)与此同时,我们还想查询出该员工所在的部门(dept_name) ...
- 【python-crypto】导入crypto包失败的情况,怎么处理
[python-crypto]导入crypto包失败的情况,怎么处理 是因为你自己安装的python的版本太高,所以自己降版本吧,捣鼓了一下午 pip install crypto pip insta ...
- MapReduce_架构
架构 MapReduce1.x JobTracker:JT(作业管理者) 将作业分解成一堆的任务:Task(MapTask和ReduceTask) 将任务分派给TaskTracker运行 作业的监控. ...
- POJ2779 线性DP 或 杨氏三角 和 钩子公式
POJ2779 线性DP 或 杨氏三角 和 钩子公式 本来就想回顾一下基础的线性DP谁知道今早碰到的都是这种大难题,QQQQ,不会 这个也没有去理解线性DP的解法,了解了杨氏三角和钩子公式,做出了PO ...
- js-图片轮播
<!DOCTYPE HTML><html><head><meta http-equiv="Content-Type" content=&q ...
- Android-Kotlin-set/get方法的使用
Student.kt package cn.kotlin.kotlin_oop04 open class Person { open var personName:String = "我是父 ...