python-18类变量2类方法3继承 (inhertance) 和 派生 (derived)

该博客回顾了Python面向对象相关知识,如对象、类、构造函数等。day18笔记重点介绍类变量、类方法、静态方法,阐述其作用与使用方式。还讲解了单继承、封装、多态,包括继承的概念、作用、语法,以及覆盖和super函数的使用,并给出学生信息管理程序的修改练习。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

day17回顾:

  • 面向对象
  • 对象 object(实例 instance)
    面向对象
  • 类 class
    类的定义的语句 class 语句
    class 类名(继承列表):
        # 实例方法
        def 实例方法名(self, 方法的形参):
            ...
        def __init__(self, 形参列表):
            ...
        def __del__(self):
            ...
            
  • 构造函数:
    类名(调用传参)

  • 对象的特征:

    • 行为(实例方法)
      吃,睡,
    • 属性(实例变量)
      姓名,年龄
  class Dog:
      pass
  dog1 = Dog()
  dog1.color = "白色"

  • del 语句:
    删除对象的属性

  • 序置属性:
    dict 属性
    绑定存储此对象的属性的字典
    __class__属性
    绑定创建此对象的类

  • 函数:
    isinstance(对象, 类或元组) 判断对象是否属于某个类或某些类的一个类的实例
    type(对象) # 返回一个对象的类

day18笔记:

  • 类变量
  • 类方法
  • 静态方法
  • 单继承
  • 封装
  • 多态

类变量

类变量是类的属性,此属性属于类,不属于类的实例

  • 作用:
    通常用来存储该类创建的对象的共有属性

  • 说明:
    类变量可以通过该类直接访问
    类变量可以通过类的实例直接访问(取值)
    类变量可以通过此类的对象的__class__属性间接访问

  • 类的文档字符串:
    类内第一个没有赋值给变量的字符串为文档字符串
    类的文档字符串可以用类的 doc 属性访问

  • 类的 slots 列表

    • 作用:
      1. 限定一个类创建的实例只能有固定的实例变量(实例属性)
      2. 不允许对象添加列表以外的实例属性
      3. 防止用户因错写属性名称而发生错误
    • 说明:
      1. __slots__属性是一个列表,列表的值是字符串
      2. 含有__slots__属性的类所创建的对象没有__dict__属性,即此实例不用字典来存储实例属性

类方法 @classmethod

类方法是用于描述类的行为的方法,类方法属于类,不属于该类创建的实例对象

  • 说明:
    1. 类方法需要使用@classmethod装饰器定义
    2. 类方法至少有一个形参,第一个形参用于绑定类,约定写为’cls’
    3. 类和该类的实例都可以调用类方法
    4. 类方法不能访问此类创建的对象的实例属性
      示例见:
      class_method.py
  • 静态方法@staticmethod
    静态方法是定义在类的内部的函数,此函数的作用域是类的内部

    • 说明:
      1. 静态方法需要使用@staticmethod装饰器定义
      2. 静态方法与普通函数定义相同,不需要传入’self’和’cls’ 参数
      3. 静态方法只能凭借该类或类的实例调用
      4. 静态方法不能访问类变量和实例变量
  • 用类来描述一个学生的信息(可以修改之前写的Student类)
    class Student:
    … 以下自己实现
    学生信息有:
    姓名, 年龄, 成绩
    将这些学生对象存于列表中,可以任意添加和删除学生信息.

    1. 打印出学生的个数
    2. 打印出所有学生的平均成绩
    3. 打印出所有学生的平均年龄
      (建议用列表的长度来计算学生的个数)

继承 (inhertance) 和 派生 (derived)

继承是从已有的类中派生出新的类,新类具有原类的属性和行为,并能扩展新的能力
派生类就是从一个已有类中衍生出新类,在新的类上可以添加新的属性和行为

  • 作用:
    1. 用继承派生机制,可以将一些共有功能加在基类中,实现代码的共享
    2. 在不改变基类代码的基础上改变原有类的功能
    • 名词:
      基类(base class),超类(super class), 父类(father class)
      派生类(derived class), 子类(child class))
  • 单继承
    • 语法:
    class 类名(基类名):
         语句块
  • 说明:
    单继承是指派生类由一个基类衍生出来
  • 继承说明:
    Python3任何类都直接或间接的继承自object类
    object类是一切类的超类

  • 类的 __base__属性
    作用:
    用来绑定此类的基类

python3中的内建内继承关系见:

help(builtins)

  • 覆盖 override
    什么是覆盖:
    覆盖是指在有继承关系的类中,子类中实现了与基类同名的方法,在子类的实例调用该方法时,实际调用的是子类中覆盖版本,这种现象叫做覆盖

  • 子类对象显式调用基类方法的方式:
    基类名.方法名(实例, 实际调用传参…)

  • super函数
    super(cls, obj) 返回绑定超类的实例(要求obj必须是cls类型的实例)
    super() 返回绑定超类的实例,等同于super(class, 实例方法的第一个参数) 必须在方法内调用

    • 作用:
      借助super() 返回实例间接调用父类的覆盖方法
  • 显式调用基类的初始化方法:
    当子类中实现了__init__ 方法,基类的实始化方法并不会被调用,此时需要显式调用基类的初始化方法

  • 练习:

    1. 修改原来的学生信息管理程序,将原来用字典存储学生信息改变用学生Student类型的对象来存储信息
      要求:
      1. 类 Student 存于文件 student.py中
      2. 尽量少在类的外部使用实例变量(建议增加实例方法来获取实例变量的信息)
### Python继承与方法重写的核心概念 #### 一、继承的基础 继承是一种重要的面向对象编程机制,它允许一个派生)从另一个(基或父)中获取属性方法。通过这种方式可以减少代码冗余并提高可维护性[^1]。 在 Python 中,定义继承关系非常简单,只需在名后的括号中指定父即可: ```python class DerivedClass(BaseClass): pass ``` Python 同时支持单继承继承。对于多继承的情况,当多个父存在同名方法时,会按照 **MRO(Method Resolution Order, 方法解析顺序)** 来决定优先级[^2]。 --- #### 二、方法重写的实现 方法重写是指子重新定义父中的某个方法的行为。这使得子可以根据自己的需求调整功能逻辑而不影响其他部分的代码结构[^4]。 以下是方法重写的典型例子: ```python class Person: def __init__(self, name, age): self.name = name self.age = age def say_name(self): print(f"我是{self.name}") class Student(Person): def __init__(self, name, age, score): super().__init__(name, age) # 调用父构造函数 self.score = score def say_name(self): # 方法重写 print(f"报告老师,我是{self.name}") def say_score(self): print(f"{self.name} 的分数是 {self.score}") s1 = Student("张三", 15, 85) s1.say_name() # 输出:报告老师,我是张三 s1.say_score() # 输出:张三 的分数是 85 s1.say_age() # 输出:张三 的年龄是:15 ``` 在这个例子中,`Student` 重写了 `say_name()` 方法来改变默认行为,并新增了一个独有的 `say_score()` 方法。 --- #### 三、调用被覆盖的父类方法 如果子重写了父的方法但仍希望保留父的功能,则可以通过 `super()` 函数显式调用父版本的方法[^3]: ```python class Parent: def greet(self): print("这是Parent的greet方法") class Child(Parent): def greet(self): super().greet() # 显式调用父类方法 print("这是Child的greet方法扩展") c = Child() c.greet() # 输出: # 这是Parent的greet方法 # 这是Child的greet方法扩展 ``` 上述代码展示了如何利用 `super()` 实现对父类方法的补充而非完全替换。 --- #### 四、多重继承及其注意事项 Python 支持多重继承,即一个可以从多个父继承特性。然而需要注意的是,在多重继承场景下可能会遇到命名冲突等问题。此时应遵循 MRO 规则解决歧义。 下面是一个简单的多重继承示例以及其执行流程说明: ```python class BaseA: def method_a(self): print("BaseA.method_a called") class BaseB: def method_b(self): print("BaseB.method_b called") class SubClass(BaseA, BaseB): def call_methods(self): self.method_a() # 基于MRO先找到BaseA的方法 self.method_b() sc = SubClass() sc.call_methods() # 输出: # BaseA.method_a called # BaseB.method_b called ``` 在此处可以看到,由于 `SubClass` 首先是基于 `BaseA` 定义的,因此它的实例化对象会优先查找来自 `BaseA` 的成员变量或者方法。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值