『无为则无心』Python面向对象 — 46、类和对象
1、理解类和对象
(1)类和对象的关系
思考:洗衣机洗衣服描述过程中,洗衣机其实就是一个事物,即对象,洗衣机对象哪来的呢?
答:洗衣机是由工厂工人制作出来。思考:工厂工人怎么制作出的洗衣机?
答:工人根据设计师设计的功能图纸制作洗衣机。归纳:图纸 → 洗衣机 → 洗衣服。
(2)总结:
- 在面向对象编程过程中,有两个重要组成部分:类 和 对象。
- 类和对象的关系:用类去创建(实例化)一个对象。
2、类
类是用于描述现实事物的,它将现实中一系列具有相同特征和行为的事物进行抽象化,模板化描述,事物的特点(属性)和行为封装在其中。
类是一个抽象的概念,不是真实存在的事物。
比如是制造洗衣机时要用到的图纸,图纸上有洗衣机的长、宽、高、形状等参数,根据图纸(类)来生产(创建)洗衣机(对象),也就是说类是用来创建对象的模版。
如下图所示:

换句话说类也是一个对象,类就是一个用来创建对象的对象。类是type类型(<class 'type'>)的对象,定义类实际上就是定义了一个type类型的对象。
实际上所有的事物都由两部分构成:
- 特征(数据)即是属性
- 行为(功能)即是方法
属性和行为统称为事物中的成员,我们也称之为成员属性和成员行为。
- 成员属性在代码中的体现就是成员变量。
- 成员行为在代码中的体现就是成员函数(方法)。
3、对象
对象是类创建出来的真实存在的事物,是现实生活中存在的具体实例、个体,即生活看到每一个事物,例如,洗衣机。
创建好对象的,通过对象就可以调用具体的属性和行为。比如真是存在的洗衣机就可以洗衣服了。
如下图:

注意:开发中,先有类,再有对象。
4、Python中的对象
- Python中对象是内存中专门用来存储数据的一块区域。
- 对象中可以存放各种数据(比如:数字、布尔值、代码)
- 对象由三部分组成:
- 对象的标识(
id):每个对象都有一个唯一的身份标识自己,任何对象的身份可以使用内建函数 id() 来得到。 - 对象的类型(
type):对象的类型决定了该对象可以保存什么类型的值,可以进行什么样的操作,以及遵循什么样的规则。可以使用type()函数查看Python对象的类型。type()返回的是对象而不是简单的字符串。 - 对象的值(
value):对象表示的数据。
- 对象的标识(
- 任何对象的
id和type,自对象创建完成就都是不可变的。value可变就是可变数据类型,value不可变的数据类型叫不可变数据类型
5、类和对象的定义
(1)定义类
Python2中类分为:经典类 和 新式类。
新式类语法:
class 类名():
代码
......
注意:类名要满足标识符命名规则,同时遵循大驼峰命名习惯(可以查看【变量】文章中关于命名的内容)。
新式类体验:
# 定义一个洗衣机类
class Washer():
# 功能洗衣服
def wash(self):
print('我会洗衣服')
拓展:经典类
不由任意内置类型派生出的类,称之为经典类(Python2中,知道就型)
# 新式类没有写类名后的(),就是经典类
class 类名:
代码
......
提示:Python 3.x中默认都是新式类。
(2)创建对象
对象也叫做实例。
语法:
对象名 = 类名()
体验:
# 通过上边创建的Washer类来创建洗衣机实例对象
# haier1就是一个Washer类型的实例对象
haier1 = Washer()
# 打印haier1对象,
# __main__表示主模块的标识符, 就是代表当前文件的标识符。
# <__main__.Washer object at 0x0000018B7B224240>
print(haier1)
# haier对象调用实例方法(洗衣服功能)
haier1.wash()
注意:创建对象的过程也叫实例化对象。
(3)练习
# 尝试定义一个表示人的类
class Person():
# 在类的代码块中,我们可以定义变量和函数
# 在类中我们所定义的变量,将会成为所有的实例的公共属性
# 公共属性,所有实例都可以访问
name = 'Python'
# 在类中也可以定义函数,类中的定义的函数,我们称为方法
# 这些方法可以通过该类创建的所有实例来访问
def say_hello(self):
# say_hello()这个方法,可以显示如下格式的数据:
# 你好!我是 xxx
# 在方法中不能直接访问类中的属性
print(f'你好!我是{name}')
# 创建Person的实例
p1 = Person()
p2 = Person()
# 获取对象属性,对象.属性名
result = p1.name
print(result) # Python
# 调用对象方法,对象.方法名()
p2.say_hello() # 你好!我是Python
6、拓展:isinstance() 函数
isinstance() 函数来判断一个对象是否是一个已知的类的实例。
isinstance() 函数的语法:
isinstance(object, classinfo)
参数说明:
- 其第一个参数(
object)为对象.- 第二个参数(
type)为类,或类的一个元组,如(int,list,float)。返回值:
- 回值为布尔型(True or flase)。
- 对象的类型与参数二的类型相同则返回True。
- 若参数二为一个元组,则若对象类型与元组中类型名之一相同即返回True。
示例:
# 1.数据类型
name = "孙悟空"
age = 18
print(isinstance(age, int)) # True
print(isinstance(age, float)) # False
print(isinstance(name, str)) # True
print(isinstance(name, list)) # False
print(isinstance(age, (int, list, float))) # True
print(isinstance(name, (int, list, float))) # False
# 2.对象
# 小花猫
class Cat():
pass
# 小奶狗
class Dog():
pass
# 蟒蛇
class Python():
pass
# 创建对象
cat = Cat()
dog = Dog()
python = Python()
print(isinstance(cat, Cat)) # True
print(isinstance(cat, (Cat, Dog))) # True
print(isinstance(cat, (Python, Dog))) # False
# 3.继承
# 定义一个父类
class Parent():
pass
# 定义一个子类
class Child(Parent):
pass
# 创建父类和子类对象
p = Parent()
c = Child()
print(isinstance(c, Child)) # True
print(isinstance(p, Parent)) # True
print(isinstance(c, Parent)) # True
print(isinstance(p, Child)) # False
# 总结:子类实例即属于子类类型,也属于父类类型,但父类实例不属于子类类型。
『无为则无心』Python面向对象 — 46、类和对象的更多相关文章
- 『无为则无心』Python面向对象 — 45、面向对象编程
目录 1.面向对象编程的概念 2.面向对象编程和面向过程编程的区别 (1)面向过程编程 (2)面向对象编程 3.举例理解面向对象 4.Python的面向对象编程 5.面向对象的几大核心特性 1.面向对 ...
- 『无为则无心』Python面向对象 — 51、私有成员变量(类中数据的封装)
目录 1.私有成员变量介绍 (1)私有成员变量概念 (2)私有成员变量特点 (3)私有成员变量体验 2.属性私有化工作原理 3.定义成员变量的标识符规范 4.私有成员变量的获取和设置方式 1.私有成员 ...
- 『无为则无心』Python面向对象 — 52、私有成员方法(类中行为的封装)
Python对于类的成员没有严格的访问控制限制,这与其他面向对象的编程语言是有所区别的. 关于私有方法其实和私有属性差不多,有如下要点: 1.通常我们约定,两个下划线开头的方法是私有方法. 2.类内部 ...
- 『无为则无心』Python面向对象 — 53、对Python中封装的介绍
目录 1.继承的概念 2.继承的好处 3.继承体验 4.单继承 5.多继承 1.继承的概念 在Python中,如果两个类存在父子级别的继承关系,子类中即便没有任何属性和方法,此时创建一个子类对象,那么 ...
- 『无为则无心』Python面向对象 — 60、魔法属性
目录 1.魔法属性__name__ 2.魔法属性__bases__ 3.魔法属性__mro__ 4.魔法属性__doc__ 5.魔法属性__module__ 和__class__ 6.魔法属性__di ...
- 『无为则无心』Python面向对象 — 56、Python多态
目录 1.Python中的多态 (1)多态的定义 (2)多态的好处 (3)多态实现步骤 2.体验多态 1.Python中的多态 (1)多态的定义 多态是一种使用对象的方式,子类重写父类方法,不同的子类 ...
- 『无为则无心』Python面向对象 — 47、Python中的self详解
目录 1.self的作用 2.self的使用注意事项 (1)self代表类的实例,而非类 (2)self不必非写成self,只是一种规范. (3)类中方法的形参中一定要写self,包括内置函数 (4) ...
- 『无为则无心』Python面向对象 — 54、重写和super()函数
目录 1.重写 2.super()函数 方式一 方式二 __mro__内置类属性说明 1.重写 在子类中如果有和父类同名的方法,则通过子类实例去调用该方法时,会调用子类中的该方法而不是父类的方法,这个 ...
- 『无为则无心』Python面向对象 — 55、多层继承和继承中的私有成员
目录 1.Python支持多层继承 (1)多层继承实现 (2)多层继承和多重继承区别 2.继承中的私有成员 (1)继承中父类私有属性和私有方法 (2)获取和修改私有属性值 1.Python支持多层继承 ...
随机推荐
- 一站式搭建 GitHub Pages 博客 (一)
本文将详细讲解如何快速搭建 GitHub Pages 博客页面 关于博客主题,博客信息更改,上传文章等将会在 一站式搭建 GitHub Pages 博客 (二) 中进行详细讲解 准备阶段 注册 Git ...
- HDU 1576 A/B (两种解法)
原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1576 分析:等式枚举法,由题意可得:, ,代入 , 得:,把变量 合在一起得: :即满足 为 倍 ...
- docker的安装以及使用命令
docker的安装 安装docker https://docs.docker.com/install/linux/docker-ce/centos/#set-up-the-repository 从 2 ...
- leetcode 787. K 站中转内最便宜的航班
问题描述 有 n 个城市通过 m 个航班连接.每个航班都从城市 u 开始,以价格 w 抵达 v. 现在给定所有的城市和航班,以及出发城市 src 和目的地 dst,你的任务是找到从 src 到 dst ...
- Shell 脚本循环遍历日志文件中的值进行求和并计算平均值,最大值和最小值
本文为博主原创,转载请注明出处: 最近在进行压测,为了观察并定位服务性能的瓶颈,所以在代码中很多地方加了执行耗时的日志,但这种方式只能观察,却在压测的时候,不太能准确的把握代码中某些方法的性能,所以想 ...
- lua之自索引
Father={ a=100, b=200 } function Father:dis() print(self.a,self.b) end Father.__index=Father Son= { ...
- golang中结构体当做函数参数或函数返回值都会被拷贝
1. 结构体做函数的参数或返回值时,都会被重新拷贝一份如果不想拷贝,可以传递结构体指针 package main import "fmt" type Person struct { ...
- linux下查看开放的端口
Nmap是一款针对大型网络的端口扫描工具,它也适用于单机扫描,它支持很多扫描,也同时支持性能和可靠性统计. [root@localhost ~]# yum install namp [root@loc ...
- linux中rpm安装
目录 一:linux中rpm安装 1.rpm简介 2.区别 3.RPM命令五种基本模式 二:RPM安装全面解析 1,下载软件包 2, 安装软件包 3, 尝试卸载 4, 更新(升级) 5,软件包名称: ...
- 创建一个python类 ,self init相关参数的简单介绍
一 创建 ''' 一 使用python 语法 创建一个类, 探究self 是干啥的 1 创建一个对象 car 2 写入两个行参 3 定义两个方法 ''' class Car(): ''' 二 init ...