python极简教程08:对象的方法
测试奇谭,BUG不见。
讲解之前,我先说说我的教程和网上其他教程的区别:
1 我分享的是我在工作中高频使用的场景,是精华内容;
2 我分享的是学习方法,亦或说,是指明你该学哪些、该重点掌握哪些内容;
3 基于1和2,你可以按照我的教程学,也可以网上找视频学,也可以看书学……你得明白,掌握学习方法比找学习资料重要得多。
这一场,主讲python的面向对象的第二部分——对象的方法。
目的:掌握Python对象的五个核心方法。
init和new
讲解之前,先上一段代码
class Demo:
def __init__(self, name):
print("init")
print("init " + name)
def __new__(cls, *args, **kwargs):
print("new")
print("new " + args[0])
d = Demo("张三")
通过前面的学习,你能说出这段代码运行的输出结果吗?
答案是:
#new
#new 张三
通常,我们会认为__init__()是类的初始化方法,当实例化类之后,会优先执行它(运行后应当优先输出"init"、"init 张三"),但实际上,__new__()方法才优先执行的方法,同时,它也是创建对象的方法。
说得通俗一点:以造房子举例,new方法是打地基,存放建材原料,init方法则是按照图纸建造房子。
那么,什么时候用new方法?
其实,用得很少,更多的时候,我们使用的是init方法。但init方法用久了之后,就会误以为它是创建实例的方法,而实际上,new方法才是创建实例的方法。
大家谨记,以免面试时踩坑。
类方法、静态方法、对象方法
首先,先讲讲这三个方法如何使用。
- 类方法:使用 @classmethod 装饰,第一个参数是cls
- 静态方法:使用 @staticmethod 装饰
- 对象方法:不使用装饰器,第一个参数是self
class Cat:
age = 5
area = 'Chengdu'
def __init__(self, name):
self.name = name
# 这是一个有问题的方法
def drink():
print("Cat drink")
# 这是一个静态方法
@staticmethod
def eat(food):
print("Cat eat {}".format(food))
# 这是一个对象方法
def get_name(self):
return self.name
# 这是一个类方法
@classmethod
def info(cls):
print(cls.age)
print(cls.area)
print(self.name)
# 实例化一只叫Kitty的黑猫
black_cat = Cat('Kitty')
# 有问题的方法,直接报错了
# black_cat.drink()
# 静态方法调用
black_cat.eat('fish') # 可以实例(black_cat)调用
Cat.eat('fish') # 也可以类(Cat)调用
# 类方法调用
black_cat.info() # 可以实例(black_cat)调用
Cat.info() # 也可以类(Cat)调用
# 对象方法调用
print(black_cat.get_name()) # 只能实例(black_cat)调用
到这里,你可能会问,这东西有啥用?
如果你只想写个脚本,执行一些简单的程序,那确实没啥用。你可以不关心这三个方法以及他们的调用,甚至连class类都不用写,直接def搞定。
但是,如果你想进阶,理解面向对象,它们很重要。
类方法
- @classmethod 修饰,第一个参数是 cls
- 方法作用:和实例无关,可以直接用
类名.方法名()调用 - 可能会需要用到类变量(注意:不是成员变量)
- 可以类调用,也可以实例调用
静态方法
- @staticmethod 修饰
- 方法作用:和实例无关,可以直接用
类名.方法名()调用,相当于一个类对外界提供的工具方法 - 基本上不会用到类变量,用到类变量的话,只能硬编码调用类变量
- 可以类调用,也可以实例调用
对象方法
- 第一个参数是self
- 实例的方法
- 可以访问成员变量
- 只能实例调用,不能类调用
一如既往,做个总结
01 我知道,对于初学者来说,面向对象,这个抽象的概念很难理解,但是,我没说,你一定要理解;
02 如果确实没有编码基础,先学会用,在用的过程中去理解,不更好吗?
python极简教程08:对象的方法的更多相关文章
- Python 极简教程(八)字符串 str
由于字符串过于重要,请认真看完并保证所有代码都至少敲过一遍. 对于字符串,前面在数据类型中已经提到过.但是由于字符串类型太过于常用,Python 中提供了非常多的关于字符串的操作.而我们在实际编码过程 ...
- python极简教程04:进程和线程
测试奇谭,BUG不见. 大家好,我是谭叔. 这一场,主讲python的进程和线程. 目的:掌握初学必须的进程和线程知识. 进程和线程的区别和联系 终于开始加深难度,来到进程和线程的知识点~ 单就这两个 ...
- python极简教程01:基础变量
测试奇谭,BUG不见. 其实很久之前,就有身边的同事或者网友让我分享一些关于python编程语言的教程,他们同大多数自学编程语言的人一样,无外乎遇到以下这些问题: 网络上的资料过多且良莠不全,不知道如 ...
- Python 极简教程(三)数据类型
每种语言都有各种数据类型.这就像在现实生活中,我们计数的时候需要用到数字,在表述金额.重量.距离等需要精确计数时用到小数,在日常交谈中要用文字,等等.在计算机语言中,为了表述不同的情况,也需要用到各种 ...
- python极简教程05:生成器和匿名函数
测试奇谭,BUG不见. 讲解之前,我先说说我的教程和网上其他教程的区别: 1 我分享的是我在工作中高频使用的场景,是精华内容: 2 我分享的是学习方法,亦或说,是指明你该学哪些.该重点掌握哪些内容: ...
- python极简教程07:封装、多态和继承
测试奇谭,BUG不见. 这一场主讲python的面向对象部分--封装.多态和继承. 目的:掌握Python面向对象的三个核心概念. 封装 01 什么是封装? 封装的目的是,保护隐私.通俗的讲:不想让别 ...
- Python 极简教程(一)前言
现在 Python 用处很多,学的人也很多,其流行程度自不必说.但是很多人学 Python 的时候都遇到过问题,特别对于非计算机专业毕业的人来说. 现在的教程非常多,但是绝大部分对于初学者都不够友好. ...
- Python 极简教程(十一)字典 dict
字典是以大括号标识,以键值对(key:value)的形式,无序,不可重复,可变的集合类型. 字典具有非常高效的读写效率. >>> d = {} # 创建一个空字典 >>& ...
- Python 极简教程(七)列表 list
由于列表过于重要,请认真看完并保证所有代码都敲过一遍. 什么是列表 列表是 Python 中最常用的数据结构,也是一种数据类型,其样式如下: li = [1, 2, 3, 'a', 'b'] 列表是一 ...
随机推荐
- LuoguP7859 [COCI2015-2016#2] GEPPETTO 题解
Content 有 \(n\) 个数 \(1\sim n\).你需要在其中选若干个数.但是还有 \(m\) 个限制,第 \(i\) 个限制格式为 \(a_i\) 不能和 \(b_i\) 一起选.问你一 ...
- java 数据类型:ArrayList;LinkList性能分析
各种线性表的性能分析. java提供的List就是一个线性表接口,ArrayList和LinkedList是线性表的两种实现.基于数组的线性表和基于链表的线性表. 一般来说,我们无需理会ArrayLi ...
- SDP 格式解析
一.SDP协议介绍 SDP 完全是一种会话描述格式 ― 它不属于传输协议 ― 它只使用不同的适当的传输协议,包括会话通知协议(SAP).会话初始协议(SIP).实时流协议(RTSP).MIME 扩展协 ...
- 【九度OJ】题目1435:迷瘴 解题报告
[九度OJ]题目1435:迷瘴 解题报告 标签(空格分隔): 九度OJ http://ac.jobdu.com/problem.php?pid=1435 题目描述: 通过悬崖的yifenfei,又面临 ...
- 【LeetCode】917. Reverse Only Letters 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 栈 单指针 双指针 日期 题目地址: https:/ ...
- hbase构建二级索引解决方案
关注公众号:大数据技术派,回复"资料",领取1024G资料. 1 为什么需要二级索引 HBase的一级索引就是rowkey,我们仅仅能通过rowkey进行检索.假设我们相对Hbas ...
- Orcale
oracleoracle中不存在引擎的概念,数据处理大致可以分成两大类:联机事务处理OLTP(on-line transaction processing).联机分析处理OLAP(On-Line An ...
- 第四个知识点 P类复杂问题
第四个知识点 P类复杂问题 原文地址:http://bristolcrypto.blogspot.com/2014/10/52-things-number-4-complexity-class-p.h ...
- ios离线打包报错Showing Recent Messages :-1: HBuilder has conflicting provisioning settings. HBuilder is automatically signed for development, but a conflicting code signing identity iPhone Distribution has
1.解决方案找到项目工程文件右击->显示包内容->双击project.pbxproj->搜索distribution改写成Developer
- Linux组
Linux组 介绍 Linux中,没有用户和文件可以脱离组而存在 用户有"组"这一属性:相关链接 文件有"所有者""组""其他组& ...