热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

python3中类的方法_(转)关于python3中staticmethod(静态方法)classmethod(类方法)实例方法的联系和区别...

原文:http:dmcoders.com20170830pythonclasshttps:zhuanlan.zhihu.comp28010894------正确理解P

原文: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)

in ()

1 '''直接调用类方法'''

----> 2 Expclass.classdef('测试-文本')

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)

in ()

1 '''实例化调用类方法'''

----> 2 demo.classdef('测试-文本')

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)

in ()

1 '''直接调用静态方法'''

----> 2 Expclass.staticdef('测试-文本')

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)

in ()

1 '''实例化调用静态方法'''

----> 2 demo.staticdef('测试-文本')

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)

in ()

1 '''直接调用实例方法'''

----> 2 Expclass.objectdef('测试-文本')

TypeError: objectdef() missing 1 required positional argument: 'text'

'''实例化调用实例方法'''

demo.objectdef('测试-文本')

--实例方法--

['测试', '文本']

类变量

实例变量

总结

1、类方法和静态方法均可访问类变量,形式不同。都不能访问实例变量

2、实例方法也可访问类变量,在变量名称相同时,它存在优先选择顺序即:实例变量>类变量>父类变量



推荐阅读
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文介绍了在处理不规则数据时如何使用Python自动提取文本中的时间日期,包括使用dateutil.parser模块统一日期字符串格式和使用datefinder模块提取日期。同时,还介绍了一段使用正则表达式的代码,可以支持中文日期和一些特殊的时间识别,例如'2012年12月12日'、'3小时前'、'在2012/12/13哈哈'等。 ... [详细]
  • Python爬虫中使用正则表达式的方法和注意事项
    本文介绍了在Python爬虫中使用正则表达式的方法和注意事项。首先解释了爬虫的四个主要步骤,并强调了正则表达式在数据处理中的重要性。然后详细介绍了正则表达式的概念和用法,包括检索、替换和过滤文本的功能。同时提到了re模块是Python内置的用于处理正则表达式的模块,并给出了使用正则表达式时需要注意的特殊字符转义和原始字符串的用法。通过本文的学习,读者可以掌握在Python爬虫中使用正则表达式的技巧和方法。 ... [详细]
  • 如何实现织梦DedeCms全站伪静态
    本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • ZSI.generate.Wsdl2PythonError: unsupported local simpleType restriction ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 如何优化Webpack打包后的代码分割
    本文介绍了如何通过优化Webpack的代码分割来减小打包后的文件大小。主要包括拆分业务逻辑代码和引入第三方包的代码、配置Webpack插件、异步代码的处理、代码分割重命名、配置vendors和cacheGroups等方面的内容。通过合理配置和优化,可以有效减小打包后的文件大小,提高应用的加载速度。 ... [详细]
  • tcpdump 4.5.1 crash 深入分析
    tcpdump 4.5.1 crash 深入分析 ... [详细]
  • 正则表达式及其范例
    为什么80%的码农都做不了架构师?一、前言部分控制台输入的字符串,编译成java字符串之后才送进内存,比如控制台打\, ... [详细]
  • Python 可视化 | Seaborn5 分钟入门 (六)——heatmap 热力图
    微信公众号:「Python读财」如有问题或建议,请公众号留言Seaborn是基于matplotlib的Python可视化库。它提供了一个高级界面来绘制有吸引力的统计图形。Seabo ... [详细]
author-avatar
1042613658_047ede
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有