1、理解类和对象

(1)类和对象的关系

  • 思考:洗衣机洗衣服描述过程中,洗衣机其实就是一个事物,即对象,洗衣机对象哪来的呢?

    答:洗衣机是由工厂工人制作出来。

  • 思考:工厂工人怎么制作出的洗衣机?

    答:工人根据设计师设计的功能图纸制作洗衣机。

  • 归纳:图纸 → 洗衣机 → 洗衣服。

(2)总结:

  • 在面向对象编程过程中,有两个重要组成部分:对象
  • 类和对象的关系:用类去创建(实例化)一个对象。

2、类

类是用于描述现实事物的,它将现实中一系列具有相同特征和行为的事物进行抽象化,模板化描述,事物的特点(属性)和行为封装在其中。

类是一个抽象的概念,不是真实存在的事物。

比如是制造洗衣机时要用到的图纸,图纸上有洗衣机的长、宽、高、形状等参数,根据图纸(类)来生产(创建)洗衣机(对象),也就是说类是用来创建对象的模版。

如下图所示:

换句话说类也是一个对象,类就是一个用来创建对象的对象。类是type类型(<class 'type'>)的对象,定义类实际上就是定义了一个type类型的对象。

实际上所有的事物都由两部分构成:

  • 特征(数据)即是属性
  • 行为(功能)即是方法

属性和行为统称为事物中的成员,我们也称之为成员属性和成员行为。

  • 成员属性在代码中的体现就是成员变量。
  • 成员行为在代码中的体现就是成员函数(方法)。

3、对象

对象是类创建出来的真实存在的事物,是现实生活中存在的具体实例、个体,即生活看到每一个事物,例如,洗衣机。

创建好对象的,通过对象就可以调用具体的属性和行为。比如真是存在的洗衣机就可以洗衣服了。

如下图:

注意:开发中,先有类,再有对象。

4、Python中的对象

  • Python中对象是内存中专门用来存储数据的一块区域。
  • 对象中可以存放各种数据(比如:数字、布尔值、代码)
  • 对象由三部分组成:
    1. 对象的标识(id):每个对象都有一个唯一的身份标识自己,任何对象的身份可以使用内建函数 id() 来得到。
    2. 对象的类型(type):对象的类型决定了该对象可以保存什么类型的值,可以进行什么样的操作,以及遵循什么样的规则。可以使用type()函数查看Python对象的类型。type()返回的是对象而不是简单的字符串。
    3. 对象的值(value):对象表示的数据。
  • 任何对象的idtype,自对象创建完成就都是不可变的。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)为类,或类的一个元组,如(intlistfloat)。

返回值:

  • 回值为布尔型(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、类和对象的更多相关文章

  1. 『无为则无心』Python面向对象 — 45、面向对象编程

    目录 1.面向对象编程的概念 2.面向对象编程和面向过程编程的区别 (1)面向过程编程 (2)面向对象编程 3.举例理解面向对象 4.Python的面向对象编程 5.面向对象的几大核心特性 1.面向对 ...

  2. 『无为则无心』Python面向对象 — 51、私有成员变量(类中数据的封装)

    目录 1.私有成员变量介绍 (1)私有成员变量概念 (2)私有成员变量特点 (3)私有成员变量体验 2.属性私有化工作原理 3.定义成员变量的标识符规范 4.私有成员变量的获取和设置方式 1.私有成员 ...

  3. 『无为则无心』Python面向对象 — 52、私有成员方法(类中行为的封装)

    Python对于类的成员没有严格的访问控制限制,这与其他面向对象的编程语言是有所区别的. 关于私有方法其实和私有属性差不多,有如下要点: 1.通常我们约定,两个下划线开头的方法是私有方法. 2.类内部 ...

  4. 『无为则无心』Python面向对象 — 53、对Python中封装的介绍

    目录 1.继承的概念 2.继承的好处 3.继承体验 4.单继承 5.多继承 1.继承的概念 在Python中,如果两个类存在父子级别的继承关系,子类中即便没有任何属性和方法,此时创建一个子类对象,那么 ...

  5. 『无为则无心』Python面向对象 — 60、魔法属性

    目录 1.魔法属性__name__ 2.魔法属性__bases__ 3.魔法属性__mro__ 4.魔法属性__doc__ 5.魔法属性__module__ 和__class__ 6.魔法属性__di ...

  6. 『无为则无心』Python面向对象 — 56、Python多态

    目录 1.Python中的多态 (1)多态的定义 (2)多态的好处 (3)多态实现步骤 2.体验多态 1.Python中的多态 (1)多态的定义 多态是一种使用对象的方式,子类重写父类方法,不同的子类 ...

  7. 『无为则无心』Python面向对象 — 47、Python中的self详解

    目录 1.self的作用 2.self的使用注意事项 (1)self代表类的实例,而非类 (2)self不必非写成self,只是一种规范. (3)类中方法的形参中一定要写self,包括内置函数 (4) ...

  8. 『无为则无心』Python面向对象 — 54、重写和super()函数

    目录 1.重写 2.super()函数 方式一 方式二 __mro__内置类属性说明 1.重写 在子类中如果有和父类同名的方法,则通过子类实例去调用该方法时,会调用子类中的该方法而不是父类的方法,这个 ...

  9. 『无为则无心』Python面向对象 — 55、多层继承和继承中的私有成员

    目录 1.Python支持多层继承 (1)多层继承实现 (2)多层继承和多重继承区别 2.继承中的私有成员 (1)继承中父类私有属性和私有方法 (2)获取和修改私有属性值 1.Python支持多层继承 ...

随机推荐

  1. FastDFSJava客户端使用

    1.1.java客户端 余庆先生提供了一个Java客户端,但是作为一个C程序员,写的java代码可想而知.而且已经很久不维护了. 这里推荐一个开源的FastDFS客户端,支持最新的SpringBoot ...

  2. IDEA超级好用的插件推荐

    IDEA超级好用的插件推荐 以下都是本人使用idea开发以来,所使用过的插件,强烈推荐,提升代码质量,事半功倍之首选!!! 先介绍下如何安装这些插件:(本人使用idea的版本是2020.2.3) 1. ...

  3. Go Error 嵌套到底是怎么实现的?

    原文链接: Go Error 嵌套到底是怎么实现的? Go Error 的设计哲学是 「Errors Are Values」. 这句话应该怎么理解呢?翻译起来挺难的.不过从源码的角度来看,好像更容易理 ...

  4. 校招——面试(Android岗)总结

    PS:持续更新,未完待续 2016.8.24某为面试 自我介绍一下 链表和数组的区别 数组的存储空间是静态.连续分布的,初始化过大会造成空间浪费,过小会使空间溢出:链表的存储空间是动态分布的,只要内存 ...

  5. Android-ViewPager中调用notifyDataSetChanged失效问题--setItemPosition--POSITION_NONE

    最基本的方法: 针对于child view比较简单的情况(例如仅有TextView.ImageView等,没有ListView等展示数据的情况),可以在自己的Adapter中加入代码: @Overri ...

  6. leetcode 83. 删除排序链表中的重复元素 及 82. 删除排序链表中的重复元素 II

    83. 删除排序链表中的重复元素 问题描述 给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次. 示例 1: 输入: 1->1->2 输出: 1->2 示例 2: 输入: ...

  7. virtual stuido同时调试多个控制台

    问题 UDP作业需要服务器端和客户端收发信息完成交互,需要同时调试多个窗口. 解决办法 但是缺点依然是无法调试2个,修改另一个测试. 所以多开可能依然是好办法.

  8. [源码分析] Facebook如何训练超大模型 --- (3)

    [源码分析] Facebook如何训练超大模型 --- (3) 目录 [源码分析] Facebook如何训练超大模型 --- (3) 0x00 摘要 0x01 ZeRO-Offload 1.1 设计原 ...

  9. DQL语句总结

    6.DQL语句总结 select ... from ... where ... group by ... having ... order by ... limit .... 执行顺序? 1,from ...

  10. Vue3.2中的setup语法糖,保证你看的明明白白!

    vue3.2 到底更新了什么? 根据原文内容的更新的内容主要有以下 5 块: 1.SSR:服务端渲染优化.@vue/server-renderer包加了一个ES模块创建, 与Node.js解耦,使在非 ...