(转)关于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 ...
随机推荐
- Everything的简单使用
1.Everythings下载地址: http://www.voidtools.com/ 下载完后直接解压,运行everything.exe即可打开使用: 2.基本设置 (1)去除不需要搜索的文件夹: ...
- C++指针一
指针也是变量,占有内存空间,用来保存内存地址. 指针也是一种数据类型,指针是一种数据类型,是指它所致内存空间的数据类型. 指针变量和它指向的内存块是两个不同的概念 *p操作内存 在指针声明时,*号表示 ...
- Task Parallelism
The Task Parallel Library (TPL) is based on the concept of a task, which represents an asynchronous ...
- web-day4
第4章WEB04- JQuery篇 今日任务 使用JQuery完成页面定时弹出广告 使用JQuery完成表格的隔行换色 使用JQuery完成复选框的全选效果 使用JQuery完成省市联动效果 使用JQ ...
- 一个前端小白,关于vue\react等框架下table的应用总结
出来实习一个月多,对于前端,运用相关的最多的就是table,想总结一下先关的内容 一.table提供的功能 1.显示表 2.可编辑:分为可编辑行和可编辑块,但是原理都一样就是设置一个flag,true ...
- android TextView 设置部分文字背景色和文字颜色
通过SpannableStringBuilder来实现,它就像html里边的元素改变指定文字的文字颜色或背景色 public class MainActivity extends Activity { ...
- AngularJS 控制器 Live Dom
控制器的作用是在$scope对象上创建属性和方法,控制器的作用域是$scope,所以作用域是针对控制器来讲的.另外,控制器实例不是单例,每次都会重新实例化,不像服务是单例的. 其是注册在模块上的,如 ...
- day04_雷神_函数
#day04 1.函数 1.1函数传参 函数定义的时候是形参:函数执行的时候是实参 实参: 位置参数.关键字参数.混合参数 位置参数:位置一一对应 关键字参数: 可以位置不对应 混合参数:关键字参数要 ...
- 用JavaScript写的动态表格
实现的功能有Table表格添加,删除.输入,删除的全选,单行删除. HTML代码部分 <body> <form> <table border="1" ...
- Linux-系统相关命令及配置文件
1.查看/配置主机名 # 查看主机名 hostname # 配置主机名(临时) hostname <HOSTNAME> # 配置主机名(永久) hostnamectl set-hostna ...