python基础第二十一节

面向对象编程.

21.1 什么是面向对象

面向对象编程是一种编程思想,它将现实世界的概念和关系映射到代码中.在面向对象编程中,我们通过创建对象来表示现实世界中的事物,并通过定义对象的属性方法来描述它们的状态行为.面向对象编程强调了代码的模块化、封装、抽象、继承和多态等概念.
例如, 在现实世界中我们需要去记录一名学生的基本信息, 如果使用文本来记录: 例如
有一名学生叫张三, 来自北京, 性别男. 这样可以轻松记录一名学生的信息.
但是使用如下表格, 结构会更加的清晰.

姓名 张三
年龄 20
籍贯 北京
性别
在现实世界中我们需要去记录一辆车的基本信息, 需要用到如下表格:
品牌
------ ----
型号
排量
车架号
上述都表格都可以很清晰的描述学生和车辆的基本信息.
表格相当于是 一个蓝图或者模板. 每个学生都可以拿着这个表格, 填写自己对应的信息, 在程序中, 就相当于是一个类, 通过这个类可以创建多个学生对象.

21.2 类(class)

类和对象是面向对象编程的核心概念.类是一个抽象的概念,用于描述对象的属性(数据)和方法(行为).对象则是类的具体实例,表示一个具体的实体.
类(class)
类是一种模板或蓝图,用于创建对象.它定义了对象的属性和方法,描述了对象的状态和行为.类通过定义一组相关的属性和方法来封装数据和操作,从而提供了一种组织和管理代码的方式.
定义类
使用 class 关键字定义一个类.类名通常使用大写字母开头,遵循大驼峰命名规范.

class Phone:
    """定义一个手机类"""

类的属性
类的属性是与类相关联的数据,用于描述对象的特征或状态.类的属性可以通过类名或对象访问.类属性在类级别上定义,被所有类的实例共享.
类属性的定义实际上就是写在类中的变量. (成员变量)

class Student:

    name = '张三'
    age = 0

在上面的示例中, Student类定义了2个类属性, nameage,它被所有Student类的实例共享. 类属性可以通过类名或者实例对象访问.
类的方法
类的方法是与类相关联的函数,用于定义对象的行为.方法在类中定义,并通过对象调用.方法可以访问和操作对象的属性.

class Student:

    name = '张三'
    age = 0

    def introduce(self):
        print(f'大家好, 我的名字叫{self.name}, 今年{self.age}岁')

    def study(self):
        print(f'{self.name}正在努力学习.')

以上示例在Student类中定义了2个方法, introducestudy. 用于定义对象的2个行为: 自我介绍和学习.
上述示例中方法中第一个形参是self的方法叫做实例方法. 类属性可以通过实例对象self来访问.

21.3 类的对象

在面向对象编程中,类的对象(Class Object)是类的具体实例, 所以类的对象也叫做实例对象.类定义了对象的属性和方法,而对象是类的实体,具有自己的属性值和对类中方法的访问权限.
创建对象
通过类, 可以创建类的实例.创建对象需要调用类的构造方法, 并传递适当的参数.

stu = Student()

实际上我们只需要在类名后面加上括号, 就可以创建一个实例对象.
实例方法
实例方法是指定义在类中的方法, 它可以访问和操作对象的实例属性, 并且在调用时会自动传入对象自身(通常用 self 来表示)作为第一个参数.实例方法是与类的实例(对象)关联的, 并且可以访问和修改对象的状态.
使用实例方法时, 需要先创建类的实例(对象), 然后通过对象调用方法, 在调用实例方法时, 不需要手动传入 self 参数, Python会自动将对象本身传递给方法.
关于self

  1. 在实例方法中, 第一个参数通常是 self, 表示对象自身.定义实例方法时, 必须将 self 作为方法的第一个参数.通过 self, 方法可以访问对象的属性和其他方法.
  2. 在创建类的实例(对象)时, Python会自动传递 self 参数给实例方法, 不需要手动传入.当调用对象的方法时, 无需显式传递 self, Python会自动将对象本身传递给方法.
  3. 在实例方法内部, 可以通过 self 来访问对象的属性和方法.例如, self.attribute 可以访问对象的属性, self.method() 可以调用对象的其他方法

21.4 对象的初始化

__init__ 是Python中一个特殊的方法, 用于初始化对象的属性.它是在创建对象时自动调用的构造方法, 也叫做魔法方法.
在类的定义中, __init__ 方法用于初始化对象的属性.通常, 在创建对象时需要对对象的属性进行初始化操作, 比如设置默认值或接收外部传入的参数.
__init__ 方法的命名是固定的, 必须使用双下划线 __ 前缀和后缀.在调用类创建对象时, Python会自动调用类的 __init__ 方法来初始化对象的属性.
注意: __init__方法只能返回None, 不能有其他返回值.
实例属性
实例属性是指定义在类的实例(对象)中的属性, 每个对象都有自己独立的实例属性.实例属性用于存储对象的状态和数据, 并且在类的实例化过程中被赋予特定的值.
在Python中, 实例属性通常是在类的构造方法 __init__ 中使用 self 关键字定义的.每个实例属性都是一个对象独有的变量, 不同的对象之间互不干扰.
实例属性和类属性总结

  1. 定义位置:
    • 实例属性:实例属性是定义在类的方法中(通常是在构造函数 __init__ 中)通过 self 关键字定义的, 每个实例(对象)都有自己的一份实例属性.
    • 类属性:类属性是定义在类的方法之外的属性, 直接在类的内部定义的, 属于整个类, 所有实例共享同一份类属性.
  2. 存储位置:
    • 实例属性:每个实例(对象)都有自己独立的实例属性, 存储在对象中.
    • 类属性:类属性属于整个类, 存储在类中.
  3. 值的独立性:
    • 实例属性:不同实例的同名实例属性是相互独立的, 一个实例的实例属性修改不会影响其他实例.
    • 类属性:所有实例共享同一份类属性, 但是通过一个实例修改类属性时, 这个修改不会影响其他实例的类属性.类属性是属于类的, 而不是属于实例的, 因此每个实例都拥有独立的类属性副本, 互不影响.
  4. 访问方式:
    • 实例属性:通过对象访问, 使用表达式 对象名.属性名.
    • 类属性:可以通过类名访问, 也可以通过对象访问.使用表达式 类名.属性名对象名.属性名.

21.5 __str__

__str__是Python中的特殊方法(魔法方法), 用于定义类的实例的字符串表示.当我们使用print函数或str()函数打印一个对象时, 实际上是调用了该对象的__str__方法来获取其字符串表示.
如果在类中定义了__str__方法, 那么当我们打印该类的实例时, 会输出__str__方法返回的字符串.这对于自定义类的字符串表示非常有用, 可以让我们以更加直观和可读的方式展示对象的内容.
主要用途包括:

  1. 打印:当你使用print函数打印一个对象时, 实际上是调用该对象的__str__方法来获取其字符串表示, 从而以更直观和易读的方式显示对象的信息.
  2. 字符串转换:当你使用str()函数来将一个对象转换为字符串时, 同样会调用该对象的__str__方法, 以获得其字符串表示.
  3. 字符串格式化:在字符串格式化时, 如果包含了对象, Python会自动调用对象的__str__方法, 以便获取对象的字符串表示.