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'] 列表是一 ...
随机推荐
- HMS Core版本发布公告
新增动作捕捉能力.通过简单拍摄即可获得人体3D骨骼关键点数据,广泛应用于虚拟形象.体育运动和医学分析等场景: 3D物体建模能力iOS版本上线. 查看详情>> 新增道路吸附能力.可根据坐标点 ...
- LuoguP7080 [NWRRC2013]Ballot Analyzing Device 题解
Content 有 \(n\) 名选手参加一个比赛,有 \(m\) 个人为他们投票.第 \(i\) 个人的投票情况用一个长度为 \(n\),并且仅包含 . 和 X 两个字符的字符串,其中,如果第 \( ...
- java 编程基础 注解 :可重复的注解
重复注解 Java8以前,同一个程序元素前最多只能使用一相同类型的注解;如果需要在同一个元素前使用多个相同类型的注解,则必须使用注解"容器".例如在Struts开发中,有时需要在 ...
- 5款超实用的.NET性能分析工具
虽然.NET框架号称永远不会发生内存泄漏,原因是引入了内存回收机制.但在实际应用中,往往我们分配了对象但没有释放指向该对象的引用,导致对象永远无法释放.最常见的情况就是给对象添加了事件处理函数,但当不 ...
- python 银行管理系统
这是一个使用python连接mysql的例子 涉及到类的使用 import pymysql import function as f def mysql(): db=pymysql.connect(h ...
- Spring Tool Suite(STS)基本安装配置
下载jar包:https://spring.io/tools 下载完成后 打开所在文件夹 执行命令行 jar -jar 下载的jar包文件名 然后会自动解压 双击打开软件 配置主面板窗口 配置好之后 ...
- istio的sidecar原理学习
目的 从内嵌到应用的SDK模式转成istio servicemesh,再到最新提出来的proxyless可谓是发展太快了.刚开始我只是围绕着服务注册和发现是怎么转变来展开研究,但是发现这个话题有点大, ...
- nanogui之更新子模块glfw3.3.2踩坑总结
nanogui源码下载: A . https://github.com/wjakob/nanogui B . https://github.com/dalerank/nanogui B是fork的A, ...
- 【LeetCode】835. Image Overlap 解题报告(Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...
- 3942 - Remember the Word
3942 - Remember the Word 思路:字典树+dp dp[i]前i个字符,能由给的字串组成的方案数,那么dp[i] = sum(dp[i-k]);那么只要只要在字典树中查看是否有字串 ...