测试奇谭,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:对象的方法的更多相关文章

  1. Python 极简教程(八)字符串 str

    由于字符串过于重要,请认真看完并保证所有代码都至少敲过一遍. 对于字符串,前面在数据类型中已经提到过.但是由于字符串类型太过于常用,Python 中提供了非常多的关于字符串的操作.而我们在实际编码过程 ...

  2. python极简教程04:进程和线程

    测试奇谭,BUG不见. 大家好,我是谭叔. 这一场,主讲python的进程和线程. 目的:掌握初学必须的进程和线程知识. 进程和线程的区别和联系 终于开始加深难度,来到进程和线程的知识点~ 单就这两个 ...

  3. python极简教程01:基础变量

    测试奇谭,BUG不见. 其实很久之前,就有身边的同事或者网友让我分享一些关于python编程语言的教程,他们同大多数自学编程语言的人一样,无外乎遇到以下这些问题: 网络上的资料过多且良莠不全,不知道如 ...

  4. Python 极简教程(三)数据类型

    每种语言都有各种数据类型.这就像在现实生活中,我们计数的时候需要用到数字,在表述金额.重量.距离等需要精确计数时用到小数,在日常交谈中要用文字,等等.在计算机语言中,为了表述不同的情况,也需要用到各种 ...

  5. python极简教程05:生成器和匿名函数

    测试奇谭,BUG不见. 讲解之前,我先说说我的教程和网上其他教程的区别: 1 我分享的是我在工作中高频使用的场景,是精华内容: 2 我分享的是学习方法,亦或说,是指明你该学哪些.该重点掌握哪些内容: ...

  6. python极简教程07:封装、多态和继承

    测试奇谭,BUG不见. 这一场主讲python的面向对象部分--封装.多态和继承. 目的:掌握Python面向对象的三个核心概念. 封装 01 什么是封装? 封装的目的是,保护隐私.通俗的讲:不想让别 ...

  7. Python 极简教程(一)前言

    现在 Python 用处很多,学的人也很多,其流行程度自不必说.但是很多人学 Python 的时候都遇到过问题,特别对于非计算机专业毕业的人来说. 现在的教程非常多,但是绝大部分对于初学者都不够友好. ...

  8. Python 极简教程(十一)字典 dict

    字典是以大括号标识,以键值对(key:value)的形式,无序,不可重复,可变的集合类型. 字典具有非常高效的读写效率. >>> d = {} # 创建一个空字典 >>& ...

  9. Python 极简教程(七)列表 list

    由于列表过于重要,请认真看完并保证所有代码都敲过一遍. 什么是列表 列表是 Python 中最常用的数据结构,也是一种数据类型,其样式如下: li = [1, 2, 3, 'a', 'b'] 列表是一 ...

随机推荐

  1. HMS Core版本发布公告

    新增动作捕捉能力.通过简单拍摄即可获得人体3D骨骼关键点数据,广泛应用于虚拟形象.体育运动和医学分析等场景: 3D物体建模能力iOS版本上线. 查看详情>> 新增道路吸附能力.可根据坐标点 ...

  2. LuoguP7080 [NWRRC2013]Ballot Analyzing Device 题解

    Content 有 \(n\) 名选手参加一个比赛,有 \(m\) 个人为他们投票.第 \(i\) 个人的投票情况用一个长度为 \(n\),并且仅包含 . 和 X 两个字符的字符串,其中,如果第 \( ...

  3. java 编程基础 注解 :可重复的注解

    重复注解 Java8以前,同一个程序元素前最多只能使用一相同类型的注解;如果需要在同一个元素前使用多个相同类型的注解,则必须使用注解"容器".例如在Struts开发中,有时需要在 ...

  4. 5款超实用的.NET性能分析工具

    虽然.NET框架号称永远不会发生内存泄漏,原因是引入了内存回收机制.但在实际应用中,往往我们分配了对象但没有释放指向该对象的引用,导致对象永远无法释放.最常见的情况就是给对象添加了事件处理函数,但当不 ...

  5. python 银行管理系统

    这是一个使用python连接mysql的例子 涉及到类的使用 import pymysql import function as f def mysql(): db=pymysql.connect(h ...

  6. Spring Tool Suite(STS)基本安装配置

    下载jar包:https://spring.io/tools 下载完成后 打开所在文件夹 执行命令行 jar -jar  下载的jar包文件名 然后会自动解压 双击打开软件 配置主面板窗口 配置好之后 ...

  7. istio的sidecar原理学习

    目的 从内嵌到应用的SDK模式转成istio servicemesh,再到最新提出来的proxyless可谓是发展太快了.刚开始我只是围绕着服务注册和发现是怎么转变来展开研究,但是发现这个话题有点大, ...

  8. nanogui之更新子模块glfw3.3.2踩坑总结

    nanogui源码下载: A . https://github.com/wjakob/nanogui B . https://github.com/dalerank/nanogui B是fork的A, ...

  9. 【LeetCode】835. Image Overlap 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...

  10. 3942 - Remember the Word

    3942 - Remember the Word 思路:字典树+dp dp[i]前i个字符,能由给的字串组成的方案数,那么dp[i] = sum(dp[i-k]);那么只要只要在字典树中查看是否有字串 ...