目录
前言:
Python 是一种面向对象的编程语言。
Python 中的几乎所有东西都是对象,拥有属性和方法。
一、面向对象OOP
二、面向对象三大特性
三、常用方法
一、面向对象OOP
1.面向对象
1)面向对象介绍
面向对象编程:Object Oriented Programming,简称OOP,是一种
程序设计思想
。
注意:
与之对应的是面向过程编程思想。实际上,能够使用面向对象编程思想实现的程序,也
与之对应的是面向过程编程思想。实际上,能够使用面向对象编程思想实现的程序,也
都能通过面向过程完成。只是看哪种思想更适合当前开发需求。
面向过程与面向对象区别:
- 面向过程:根据业务逻辑从上到下写代码
- 面向对象:将数据与函数绑定到一起,进行封装。减少重复代码的重写过程
2.类与对象
1)类
类是抽象的概念,仅仅是模板。用来描述具有相同属性和方法的对象的集合。比如:"人"是一
个类。
2)对象
某一个具体事物的存在 ,在现实世界中可以是看得见摸得着的。 比如:"胡歌"就是一个对象。
3)类与对象的关系
那么实际上,我们可以进行
对象归类
。
3.类的构成
1)类的构成
类主要由 3 部分构成:
由
3
个部分构成
类的
名称
->> 类名
类的
属性
->> 一组数据
类的
方法
->> 允许对类进行操作的方法
2)类的定义
Python 中使用
class
关键字来定义类,其基本结构如下:
class 类名:
pass
eg:使用名为 x 的属性,创建一个名为 MyClass 的类
class Myclass:
x = 1
3)创建对象
在 Python 中,可以根据已经定义的类去创建出一个个对象,语法如下:
对象名 = 类名()
eg:创建一个名为 p1 的对象,并打印 x 的值:
class Myclass:
x = 1
p1 = Myclass()
print(p1.x)
输出:
1
4)类的构成
eg1:实现以下操作
创建类:学生类
创建对象:张三
在类中定义方法输出:张三学习Python
4.self 参数
1)self 参数介绍
在类当中定义方法时,会发现系统帮我们自动创建了
self
参数,并且在调用对象的该方法时,也无
需传入 self 参数。那这个 self 是什么?
实际上,我们需要明确 self 的两个概念
- self 本身是 形参
- self 就是 对象本身
一、self 参数介绍
eg1:实现以下操作
定义类为:学生类
创建对象:李四
在类中定义方法:打印李四信息
5.牛逼的方法
1)__init__() 方法
__init__() 方法称为
初始化
方法,也可称为
构造方法
。在
创建对象
时,会
自动执行该方法
,为对象
的属性设置初始值。
eg1:如以下代码,会先输出--1--,还是先输出--2--?
class Student():
def _init_(self):
print("---1---")
bruin = Student()
print("--2--")
输出:
--2--
注意:in_init_()方法只是为对象的属性赋初值,不会有打印输出等的作用.
2)__str__() 方法
如果在开发中,希望打印输出对象变量时,
能够打印自定义的内容
。就可以使用__str__()方法,将
自定义内容通过return关键字返回。
注意:返回值必须是字符串。
6.私有属性与私有方法
1)私有属性与私有方法介绍
在实际开发中,对象的某些属性或者方法,只希望在对象的内部使用,这时,我们就可以使用私有属性和私有方法。
2)私有属性
私有属性:就是对象不希望公开的属性
定义方式:在属性名前面增加两个下划线(例如:__name)
eg1:一定要在类的外部访问到对象的私有属性,如何实现?
方法:
- 可以通过类的内部的方法访问私有属性
- 通过类的内部方法将私有属性返回出去
- 在类的外部调用该方法并且接收就可
3)私有方法
私有方法:就是对象不希望公开的方法
定义方式:在方法名前面增加两个下划线(例如:__test)
注意:
在 python 中,并没有真正意义上的私有,只有伪私有。当我们在访问时,以 对象._类名__私有属
性 即可访问,私有方法同理。但是不建议使用。
二、面向对象三大特性
1.封装
1)封装介绍
封装是面向对象编程的一大特点,将
属性
和
方法
放到
类的内部
,通过对象访问属性或者方
法,隐藏功能的实现细节,也可以设置访问权限。
2.继承
1)继承介绍
继承是一种创建新类的方式,如果子类需要
复用父类
的属性或者方法时,就可以使用继承。
当然,子类也可以提供自己的属性和方法。
作用:避免重复造轮子,减少代码的冗余
2)继承语法
语法:
class Father(object):
pass
class Son:
pass
注意:在 Python3 中,都默认继承 object 基类。
3)单继承
子类继承父类,则可以直接享受父类中已经封装好的方法
总结:当对象调用方法时,查找顺序先从自身类找,如果自身没找到,则去父类找,父类无,
再到父类的父类找,直到object类,若还无,则报错。这也称为
深度优先机制
。
4)重写
注意:当 子类 与 父类 拥有同名称的方法时,子类对象调用该方法
优先执行自身
的方法。那
么实际上就是子类的方法
覆盖
父类的方法,也称为
重写
。
问题:实际的开发中,遵循开放封闭原则。我们并不会完全的重写父类的方法,而是希望同时
实现父类的功能。
5)super
super() 函数是用于调用父类的一个方法。
语法:
super().方法名()
6)多继承
所谓多继承,即子类有多个父类,并且具有它们的特征。
情景1:
- 遵循左边优先原则
情景2:
- 左边一条路走到黑
情景3:
- 1.左边优先 2.根最后执行
3.多态
多态的概念是应用于 Java 和 C# 这一类强类型语言中,而Python崇尚"鸭子类型"。
动态语言调用实例方法时不检查类型,只要方法存在,参数正确,就可以调用。这就是动态语
言的“鸭子类型”,它并不要求严格的继承体系,一个对象只要“看起来像鸭子,走起路来像
鸭子”,那它就可以被看做是鸭子。
所谓多态:定义时的类型和运行时的类型不一样,此时就成为多态。
三、常用魔法方法
1.魔法方法介绍
在 Python 中,有一些内置好的特定方法,这些方法在进行特定的操作时会
自动
被调用,称
为
魔法方法
。
魔法方法的命名总是被双下划线包围,比如:
__名称__
2.常用魔法方法
1)__new__() 方法
__new__()
:用于
创建
与
返回
一个对象,在类准备将自身实例化时调用。
class Demo(object):
def __init__(self):
print("__init__")
def __new__(cls, *args, **kwargs ):
print("__new__")
d = Demo()
# __new__
解析
:
- __new__() 方法用于创建对象
- __init__() 方法在对象创建的时候,自动调用。
-
此处重写了父类的 __new__() 方法,覆盖了父类 __new__() 创建对象的功能,所以对象并没有创建成功。所以仅执行 __new__() 方法内部代码
对象创建执行顺序
:
1. 通过
__new__()
方法创建对象
2. 并将对象返回,传给
__init__()
eg1:在自定义类中实现创建对象
思路:
- 重写父类 __new__() 方法
- 并且在该方法内部,调用父类的 __new__() 方法
__init__() 与 __new__() 区别
:
- __init__ 实例方法,__new__ 静态方法
- __init__ 在对象创建后自动调用,__new__ 创建对象的方法
2. __del__() 方法
__del__()
:叫做析构方法。当由该类创建的实例对象,被删除或者说在内存中被释放,将会自动触发执行。
注意
:
- 当代码 全部执行完毕 才 自动 触发__del__()
- 如果需要提前触发,则需要通过 del 关键字,删除所有对象后触发__del__()
注意
:
此方法一般不需要定义,因为 Python 是一门高级语言,程序员在使用时无需关心内存的分配与释放,一 般都是交给 Python 解释器来执行。所以,析构函数的调用是由解释器在进行垃圾回收时自动触发执行。