python基础第二十一节
面向对象编程.
21.1 什么是面向对象
面向对象编程是一种编程思想,它将现实世界的概念和关系映射到代码中.在面向对象编程中,我们通过创建对象来表示现实世界中的事物,并通过定义对象的属性和方法来描述它们的状态和行为.面向对象编程强调了代码的模块化、封装、抽象、继承和多态等概念.
例如, 在现实世界中我们需要去记录一名学生的基本信息, 如果使用文本来记录: 例如
有一名学生叫张三, 来自北京, 性别男. 这样可以轻松记录一名学生的信息.
但是使用如下表格, 结构会更加的清晰.
| 姓名 | 张三 |
|---|---|
| 年龄 | 20 |
| 籍贯 | 北京 |
| 性别 | 男 |
| 在现实世界中我们需要去记录一辆车的基本信息, 需要用到如下表格: | |
| 品牌 | |
| ------ | ---- |
| 型号 | |
| 排量 | |
| 车架号 | |
| 上述都表格都可以很清晰的描述学生和车辆的基本信息. | |
| 表格相当于是 一个蓝图或者模板. 每个学生都可以拿着这个表格, 填写自己对应的信息, 在程序中, 就相当于是一个类, 通过这个类可以创建多个学生对象. |
21.2 类(class)
类和对象是面向对象编程的核心概念.类是一个抽象的概念,用于描述对象的属性(数据)和方法(行为).对象则是类的具体实例,表示一个具体的实体.
类(class)
类是一种模板或蓝图,用于创建对象.它定义了对象的属性和方法,描述了对象的状态和行为.类通过定义一组相关的属性和方法来封装数据和操作,从而提供了一种组织和管理代码的方式.
定义类
使用 class 关键字定义一个类.类名通常使用大写字母开头,遵循大驼峰命名规范.
class Phone:
"""定义一个手机类"""
类的属性
类的属性是与类相关联的数据,用于描述对象的特征或状态.类的属性可以通过类名或对象访问.类属性在类级别上定义,被所有类的实例共享.
类属性的定义实际上就是写在类中的变量. (成员变量)
class Student:
name = '张三'
age = 0
在上面的示例中, Student类定义了2个类属性, name和age,它被所有Student类的实例共享. 类属性可以通过类名或者实例对象访问.
类的方法
类的方法是与类相关联的函数,用于定义对象的行为.方法在类中定义,并通过对象调用.方法可以访问和操作对象的属性.
class Student:
name = '张三'
age = 0
def introduce(self):
print(f'大家好, 我的名字叫{self.name}, 今年{self.age}岁')
def study(self):
print(f'{self.name}正在努力学习.')
以上示例在Student类中定义了2个方法, introduce和study. 用于定义对象的2个行为: 自我介绍和学习.
上述示例中方法中第一个形参是self的方法叫做实例方法. 类属性可以通过实例对象self来访问.
21.3 类的对象
在面向对象编程中,类的对象(Class Object)是类的具体实例, 所以类的对象也叫做实例对象.类定义了对象的属性和方法,而对象是类的实体,具有自己的属性值和对类中方法的访问权限.
创建对象
通过类, 可以创建类的实例.创建对象需要调用类的构造方法, 并传递适当的参数.
stu = Student()
实际上我们只需要在类名后面加上括号, 就可以创建一个实例对象.
实例方法
实例方法是指定义在类中的方法, 它可以访问和操作对象的实例属性, 并且在调用时会自动传入对象自身(通常用 self 来表示)作为第一个参数.实例方法是与类的实例(对象)关联的, 并且可以访问和修改对象的状态.
使用实例方法时, 需要先创建类的实例(对象), 然后通过对象调用方法, 在调用实例方法时, 不需要手动传入 self 参数, Python会自动将对象本身传递给方法.
关于self
- 在实例方法中, 第一个参数通常是
self, 表示对象自身.定义实例方法时, 必须将self作为方法的第一个参数.通过self, 方法可以访问对象的属性和其他方法. - 在创建类的实例(对象)时, Python会自动传递
self参数给实例方法, 不需要手动传入.当调用对象的方法时, 无需显式传递self, Python会自动将对象本身传递给方法. - 在实例方法内部, 可以通过
self来访问对象的属性和方法.例如,self.attribute可以访问对象的属性,self.method()可以调用对象的其他方法
21.4 对象的初始化
__init__ 是Python中一个特殊的方法, 用于初始化对象的属性.它是在创建对象时自动调用的构造方法, 也叫做魔法方法.
在类的定义中, __init__ 方法用于初始化对象的属性.通常, 在创建对象时需要对对象的属性进行初始化操作, 比如设置默认值或接收外部传入的参数.
__init__ 方法的命名是固定的, 必须使用双下划线 __ 前缀和后缀.在调用类创建对象时, Python会自动调用类的 __init__ 方法来初始化对象的属性.
注意: __init__方法只能返回None, 不能有其他返回值.
实例属性
实例属性是指定义在类的实例(对象)中的属性, 每个对象都有自己独立的实例属性.实例属性用于存储对象的状态和数据, 并且在类的实例化过程中被赋予特定的值.
在Python中, 实例属性通常是在类的构造方法 __init__ 中使用 self 关键字定义的.每个实例属性都是一个对象独有的变量, 不同的对象之间互不干扰.
实例属性和类属性总结
- 定义位置:
- 实例属性:实例属性是定义在类的方法中(通常是在构造函数
__init__中)通过self关键字定义的, 每个实例(对象)都有自己的一份实例属性. - 类属性:类属性是定义在类的方法之外的属性, 直接在类的内部定义的, 属于整个类, 所有实例共享同一份类属性.
- 实例属性:实例属性是定义在类的方法中(通常是在构造函数
- 存储位置:
- 实例属性:每个实例(对象)都有自己独立的实例属性, 存储在对象中.
- 类属性:类属性属于整个类, 存储在类中.
- 值的独立性:
- 实例属性:不同实例的同名实例属性是相互独立的, 一个实例的实例属性修改不会影响其他实例.
- 类属性:所有实例共享同一份类属性, 但是通过一个实例修改类属性时, 这个修改不会影响其他实例的类属性.类属性是属于类的, 而不是属于实例的, 因此每个实例都拥有独立的类属性副本, 互不影响.
- 访问方式:
- 实例属性:通过对象访问, 使用表达式
对象名.属性名. - 类属性:可以通过类名访问, 也可以通过对象访问.使用表达式
类名.属性名或对象名.属性名.
- 实例属性:通过对象访问, 使用表达式
21.5 __str__
__str__是Python中的特殊方法(魔法方法), 用于定义类的实例的字符串表示.当我们使用print函数或str()函数打印一个对象时, 实际上是调用了该对象的__str__方法来获取其字符串表示.
如果在类中定义了__str__方法, 那么当我们打印该类的实例时, 会输出__str__方法返回的字符串.这对于自定义类的字符串表示非常有用, 可以让我们以更加直观和可读的方式展示对象的内容.
主要用途包括:
- 打印:当你使用
print函数打印一个对象时, 实际上是调用该对象的__str__方法来获取其字符串表示, 从而以更直观和易读的方式显示对象的信息. - 字符串转换:当你使用
str()函数来将一个对象转换为字符串时, 同样会调用该对象的__str__方法, 以获得其字符串表示. - 字符串格式化:在字符串格式化时, 如果包含了对象, Python会自动调用对象的
__str__方法, 以便获取对象的字符串表示.