文章目录

  • 面向对象的基础知识
  • 类的实例化
    • 实例属性
    • 类属性
  • 类的操作(调用方法和属性)
    • 实例方法
    • 构造方法
    • 析构方法
  • self参数的作用
  • 类方法
  • 面向对象的三大特性
    • 继承:
    • 多态:来源于继承,一个事务具备多个形态
    • 扩展:多态性,不同的对象可以使用相同的函数名

面向对象的基础知识

opo:object oriented programming 面向对象的程序设计,一种程序设计理念,核心对象 类+对象

类:类是对一组具有相同属性和行为的对象的抽象

对象:对象指的是一个具体的实体,不用于指代一个抽象的群体,类的实例化,具体的类的体现

属性:

  • 类属性:类属性是隶属于类的属性,用于描述类的特征

  • 实例属性:实例属性是隶属于具体对象的属性,用于描述具体的对象

  • 私有属性:

    • 定义:属性名称前加上前缀 __,表示该属性为私有属性

    • 只能在类的实例方法中访问私有属性,不允许在类的外部访问私有属性

      例:

      class Person:def __init__(self, name):self.__name = nametom = Person('tom')
      print(tom.__name)-----------------------------------Traceback (most recent call last):File "attr-get.py", line 6, in <module>print(tom.__name)
      AttributeError: 'Person' object has no attribute '__name'
      

      在第 1 行,定义了类 Person

      在第 3 行,创建私有属性 __name

      在第 5 行,创建一个实例 tom

      在第 6 行,直接访问实例的属性 __name

      程序运行报错:‘Person’ object has no attribute ‘__name’,表示无法找到属性 __name’。因此,在类 Person 的外部无法直接读取实例的私有属性

类的实例化

实例属性

定义:实例属性是隶属于具体对象的属性,用于描述具体的对象

class Person:passzhou = Person()
zhou.name = 'Zhou'
zhou.age = 58
print('name = %s, age = %d' % (zhou.name, zhou.age))liu = Person()
liu.name = 'Liu'
liu.age = 53
print('name = %s, age = %d' % (liu.name, liu.age))
  • 在第 1 行,定义了类 Person

  • 在第 4 行,使用类 Person 创建一个对象 zhou

    • 在第 5 行,设置对象 zhou 的属性 name,该属性为实例属性
    • 在第 6 行,设置对象 zhou 的属性 age,该属性为实例属性
    • 在第 7 行,打印对象 zhou 的属性 name 和 age
  • 在第 9 行,使用类 Person 创建一个对象 liu

    • 在第 10 行,设置对象 liu 的属性 name,该属性为实例属性
    • 在第 11 行,设置对象 liu 的属性 age,该属性为实例属性
    • 在第 12 行,打印对象 liu 的属性 name 和 age

类属性

定义:类属性是隶属于类的属性,用于描述类的特征

在 Python 中,类属性在类中的定义如下所示:

class 类名:类属性 = 值

示例代码如下:

class Person:count = 0zhou = Person()
zhou.name = 'Zhou'
zhou.age = 58
Person.count = Person.count + 1
print('Person.count = %d' % Person.count)liu = Person()
liu.name = 'Liu'
liu.age = 53
Person.count = Person.count + 1
print('Person.count = %d' % Person.count)
  • 在第 1 行,定义了类 Person

  • 在第 2 行,定义了类 Person 的属性 count,该属性是类属性,描述了 Person 对象的数量

  • 在第 4 行,使用类 Person 创建一个对象 zhou

    • 在第 5 行,设置对象 zhou 的属性 name,该属性为实例属性
    • 在第 6 行,设置对象 zhou 的属性 age,该属性为实例属性
  • 因为新创建了一个对象 zhou

    • 在第 7 行,访问 Person 的类属性 count,对其增加 1
    • 在第 8 行,打印 Person 的类属性 count
  • 在第 10 行,使用类 Person 创建一个对象 liu

    • 在第 11 行,设置对象 liu 的属性 name,该属性为实例属性
    • 在第 12 行,设置对象 liu 的属性 age,该属性为实例属性
  • 因为新创建了一个对象 liu

    • 在第 13 行,访问 Person 的类属性 count,对其增加 1
    • 在第 14 行,打印 Person 的类属性 count

    程序运行输出如下:

Person.count = 1
Person.count = 2

类的操作(调用方法和属性)

实例方法

定义:实例方法是用于访问对象实例属性的方法

class 类:def 实例方法(self):self.属性

实例方法定义在类中,它的第一个参数 self 指向调用该方法的对象,在实例方法中通过 “self.属性” 访问对象的实例属性。

例:每个人具有 name 和 age 的属性,创建一个类 Person,在类 Person 中定义实例方法 introduce 访问对象的属性,代码示例如下:

class Person:def introduce(self):print('name = %s, age = %d' % (self.name, self.age))tom = Person()
tom.name = 'tom'
tom.age = 10
tom.introduce()jerry = Person()
jerry.name = 'jerry'
jerry.age = 20
jerry.introduce()
  • 在第 1 行,定义了类 Person
  • 在第 2 行,定义了类 Person 的方法 introduce,introduce 的 self 参数指向调用 introduce 方法的对象

  • 在第 3 行,introduce 方法通过 self.name 和 self.age 访问对象的属性

  • 在第 5 行,使用类 Person 创建一个对象 tom

  • 在第 6 行,设置对象 tom 的属性 name,该属性为实例属性

  • 在第 7 行,设置对象 tom 的属性 age,该属性为实例属性

  • 在第 8 行,调用对象 tom 的方法 introduce,对象 tom 被传递给方法 introduce,作为 self 参数,在执行 introduce 时,self 参数指向对象 tom

  • 在第 10 行,使用类 Person 创建一个对象 jerry

  • 在第 11 行,设置对象 jerry 的属性 name,该属性为实例属性

  • 在第 12 行,设置对象 jerry 的属性 age,该属性为实例属性

  • 在第 13 行,调用对象 jerry 的方法 introduce,对象 jerry 被传递给方法 introduce,作为 self 参数,在执行 introduce 时,self 参数指向对象 jerry

    程序运行结果:

name = tom, age = 10
name = jerry, age = 20

构造方法

语法:

class 类:def __init__(self, 参数):self.属性 = 参数对象 = 类(参数)
  • 方法名的前缀和后缀是两个下划线 _
  • 方法的第一个参数 self 指向新创建的对象
  • 方法的其余参数用于设定对象的属性

例子:每个人具有 name 和 age 的属性,创建一个类 Person,在类 Person 中定义构造方法 init,创建对象时设定对象的属性,代码示例如下:

class Person:def __init__(self, name, age):self.name = nameself.age = agedef introduce(self):print('name = %s, age = %d' % (self.name, self.age))tom = Person('tom', 10)
tom.introduce()jerry = Person('jerry', 20)
jerry.introduce()
  • 在第 1 行,定义了类 Person
  • 在第 2 行,定义了类 Person 的构造方法 init
  • init 的 self 参数指向新创建的对象
  • 在第 3 行和第 4 行,初始化对象的 name 和 age
  • 在第 6 行,定义了类 Person 的实例方法 introduce
  • introduce 的 self 参数指向调用 introduce 方法的对象
  • 在第 7 行,输出对象的 name 和 age
  • 在第 9 行,使用类 Person 创建一个对象 tom
  • 新创建对象 tom 时,tom 的属性 name 和 age 为空
  • 将对象 tom 作为参数传递给类 Person 的构造方法 init
  • 在构造方法 init** 设置属性 name 和 age
  • 在第 12 行,使用类 Person 创建一个对象 jerry
  • 新创建对象 jerry 时,jerry 的属性 name 和 age 为空
  • 将对象 jerry 作为参数传递给类 Person 的构造方法 init
  • 在构造方法 init** 设置属性 name 和 age 程序运行输出如下:
name = tom, age = 10
name = jerry, age = 20

析构方法

定义:Python 提供了一种机制使得对象被删除前能够得到通知。对象被删除时,如果该对象拥有名为 del 的方法,该方法在删除前被调用,该方法又被称为析构方法

语法:

class 类:def __del__(self):self.属性
  • 方法名的前缀和后缀是两个下划线 _
  • 方法的参数 self 指向将被删除的对象

例:

创建一个类 Person,并定义析构方法 del,然后使用类 Person 创建两个对象,最后再使用 del 语句删除他们,验证析构方法,代码示例如下:

class Person:def __init__(self, name, age):self.name = nameself.age = agedef __del__(self):print('del %s' % self.name)def introduce(self):print('name = %s, age = %d' % (self.name, self.age))tom = Person('tom', 10)
tom.introduce()jerry = Person('jerry', 20)
jerry.introduce()del tom
del jerry
  • 在第 1 行,定义了类 Person
  • 在第 2 行,定义了构造方法 init
  • 在第 6 行,定义了析构方法 del
  • 在第 9 行,定义了实例方法 introduce
  • 在第 12 行,使用类 Person 创建一个对象 tom
  • 在第 13 行,使用类 Person 创建一个对象 jerry
  • 在第 18 行,使用 del 语句删除对象 tom,调用析构方法 tom.del()
  • 在第 19 行,使用 del 语句删除对象 jerry,调用析构方法 jerry.del() 程序运行输出如下:
name = tom, age = 10
name = jerry, age = 20
del tom
del jerry

self参数的作用

  • self 出现在方法上:表示内置方法,自定义方法
def cat(self):
  • self出现在类属性中:调用类属性
print(f'这是一只猫!,我叫{self.name}')
  • self出现在类中的方法中:调用类中其他方法
def run(self):
self.cat()
  • self:类自己,只能使用在类的内部

类方法

普通方法:self必须参数类方法:classmethod,必须参数:cls静态方法:staticmethod 没有必须参数

面向对象的三大特性

封装:

开放接口,隐藏实现 ,python中封装很普遍,数据的封装:列表 ,字典,元组,集合;接口封装-方法【内置函数,外部函数】

继承:

定义:

在面向对象的程序设计中,定义一个新的 class 的时候,可以从某个现有的 class 继承,新的 class 称为子类,而被继承的 class 称为基类、父类或超类。

语法:

class Parent:passclass Child(Parent):pass

多态:来源于继承,一个事务具备多个形态

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HiE7nImu-1655351962755)(https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/fefe6750418a41af809f9ee9cbd15189~tplv-k3u1fbpfcp-watermark.image?)]

扩展:多态性,不同的对象可以使用相同的函数名

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eugCUxR4-1655351962757)(https://p9-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/388b976a6c9e438a83588c7673a81cbb~tplv-k3u1fbpfcp-watermark.image?)]

python 面向对象篇相关推荐

  1. Python面向对象篇(2)-继承

    在发表本篇随笔的时候,距离上一次发已经有一个多月了,很多朋友私信我为什么不持续更新了,在这里先跟大家说声抱歉.因为年底的工作较为繁重,实在分不出精力,更重要的也是在思考后面进阶的部分要按怎样的顺序写, ...

  2. python——面向对象篇之异常和反射

    内置函数isinstance和issubclass 1.1 isinstance用法: 1 isinstance(string,str) 判断第一个参数是否是第二个参数的子集,例如: 1 print ...

  3. python 面向对象(进阶篇)

    上一篇<Python 面向对象(初级篇)>文章介绍了面向对象基本知识: 面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类 是一个模板,模板中包装了多个" ...

  4. python自学篇十[ 面向对象 (四) :王者荣耀小游戏+模拟一个简单的银行进行业务办理的类]

    python基础系列: python自学篇一[ Anaconda3安装 ] python自学篇二[ pycharm安装及使用 ] python自学篇三[ 判断语句if的使用 ] python自学篇四[ ...

  5. 跟着王进老师学开发Python篇第五季:面向对象篇-王进-专题视频课程

    跟着王进老师学开发Python篇第五季:面向对象篇-422人已学习 课程介绍         课程从0开始,讲到人工智能:按阶段授课,从入门到跑路: 适合无基础的小白,也适合定制,需要哪个模块学哪个模 ...

  6. Python面向对象编程:类继承和其衍生术语

    Python面向对象编程03:类继承和其衍生术语 前面我们讲到过正则表达式字符等,上一篇分享了面向对象编程和类的结构,最后稍微提到了继承. Python面向对象编程:深度认识类class_ Pytho ...

  7. 关于python面向对象编程中、下列说法中_关于Python面向对象编程的知识点总结

    前言 如果你以前没有接触过面向对象的编程语言,那你可能需要先了解一些面向对象语言的一些基本特征,在头脑里头形成一个基本的面向对象的概念,这样有助于你更容易的学习Python的面向对象编程. 接下来我们 ...

  8. 什么是python-了解什么是Python面向对象(1)

    今天马哥教育要跟大家分享的文章是了解什么是Python面向对象(1)?相信大家见过很多的Python公众号上有面向对象的文章,点击却是帅哥或者美女的简介,大家是不是被搞糊涂了呢?面向对象在Python ...

  9. python编程基础是什么-Python面向对象编程基础解析(一)

    1.什么是面向对象 面向对象(oop)是一种抽象的方法来理解这个世界,世间万物都可以抽象成一个对象,一切事物都是由对象构成的.应用在编程中,是一种开发程序的方法,它将对象作为程序的基本单元. 2.面向 ...

最新文章

  1. 使用cat,awk和sort命令从nginx访问日志中统计user-agent类型
  2. 数据库开发基本操作-关于sql server 2005 未开放1433端口的问题
  3. vba 窗体单选框怎么传回sub_VBA之EXCEL应用
  4. Harris算子的运用 用于图像配准
  5. C++ vector 容器浅析
  6. 使用树莓派搭建WordPress个人博客
  7. 树和二叉树的基本概念(二级)
  8. C#学习笔记——25个经典问题
  9. 创建二叉树的代码_解二叉树的右视图的两种方式
  10. 创建表结构相同的表,表结构相同的表之间复制数据,Oracle 中 insert into XXX select from 的用法...
  11. 英伟达新开源GPU加速平台:主打数据科学和机器学习,50倍于CPU
  12. 常见的javascript日期和时间戳互相转化
  13. C#类的定义与对象使用
  14. 小米路由器刷梅林教程_小米路由器3刷X-Wrt固件教程
  15. qdialog修改标题栏图标_qt – 如何在QDockWidget标题栏中显示图标?
  16. 主播入门到精通培训实操手册全套资料(共300份)
  17. 7个等级 容灾等级_容灾的等级
  18. java getbytes 不一样_(透彻)java String.getBytes()编码问题
  19. php 在服务器运行不起,PHP Cookies在localhost上运行良好,但在实时服务器上不起作用...
  20. 转载|领英开源TonY:构建在Hadoop YARN上的TensorFlow框架

热门文章

  1. 序列化:Protobuf 与 JSON、XML 的对比
  2. 酒店管理者必备的九大管理知识
  3. 【IDEA】配置翻译插件【Translate】
  4. 485与计算机连接,RS422与RS485的连接方法
  5. 人不是被事物本身困扰是什么理论_心理学:人不是被事情本身所困扰,而是被其对事情的看法所困扰!...
  6. 15.7.1压缩文件
  7. Android第一节(体系介绍),维维复习
  8. 方差代价函数到梯度下降函数
  9. 基于android记事本毕业论文,基于Android的记事本应用的设计与实现-毕业论文.doc...
  10. 华为HG8245C光猫设置VOIP