内容概要
- 动态方法与静态方法
- 面向对象的三大特征之:继承
- 继承的本质
- 名字的查找顺序
- 派生类
- 派生功能之重写列表
动态方法与静态方法
动态方法
| |
| 1.绑定给对象的方法 |
| class Student: |
| def run(self): |
| prtin(self) |
| |
| |
| Student.run(123) |
| |
| obj1 = Student() |
| obj1.run() |
| |
| 2.绑定给类的方法 |
| class Student: |
| @classmethod |
| def eat(cls): |
| prtin(cls) |
| |
| |
| print(Student) |
| Student.eat() |
| |
| obj1 = Student() |
| obj1.eat() |
| |
| |
静态方法
| |
| class Student: |
| @staticmethod |
| def speak(cls): |
| print(cls) |
| |
| 1.普普通通的函数:无论谁来调 都必须传固定的参数个数 |
| |
| Student.speak(123) |
| |
| obj1 = Student() |
| obj1.speak(321) |
| |
面向对象的三大特征之:继承
| ''' |
| 面向对象的三大特征: |
| 继承 封装 多态 |
| 其中最重要的就是继承!!! |
| ''' |
| |
| 在现实生活中继承就是用来描述人与人之间资源的从属关系 |
| eg:儿子继承父亲的资产 遗嘱等 那么儿子就会拥有之前父亲拥有的一切 |
| '面向对象中继承使用则是用于描述类与类之间的从属关系' |
| eg:类A继承类B 那么类A就可以使用类B中所有的数据(数据、功能...) |
| |
| |
| 现实生活中可以通过继承的方式快速的积累财富 少奋斗n多年 而且可多继承 |
| eg:有多个爹 磅多个富婆 |
| '面向对象中通过继承可以减少代码冗余 提升开发效率 同样也支持多继承' |
| eg:类A可以继承多个类同时拥有多个类里面的代码使用权 |
| |
| |
| """ |
| class B: |
| print('from B') |
| class A(B): |
| pass |
| *我们将被继承的类称为:父类或者基类 B |
| *继承别人的类称为:子类或者派生类 A |
| """ |
| 在python中一个类可以同时继承多个父类 |
| class A(B,C,D): |
| pass |
继承的本质
| 抽象:由下往上抽取相同特征 |
| 继承:由上往下直接白嫖资源 |
| """ |
| 在面向对象编程中 其实类和父类的主要功能都是用来减少代码冗余的 |
| |
| 对象:数据与功能的结合体 |
| 类:多个对象相同数据和功能的结合体 |
| 父类:多个类相同数据和功能的结合体 |
| """ |
| class Person: |
| def __init__(self, name, age, gender): |
| self.name = name |
| self.age = age |
| self.gender = gender |
| class Teacher(Person): |
| def teach(self): |
| print(f'{self.name}老师正在讲课') |
| class Student(Person): |
| def study(self): |
| print(f'{self.name}学生正在学习') |
| stu1 = Student('jason', 18, 'male') |

查找顺序
不继承和单继承查找
| '''名字的查找顺序永远都是 先从当前对象自身开始查找''' |
| |
| |
| 名字的查找顺序是 |
| 先从对象自己的名称空间中查找 没有则去类里面的名称空间查找 |
| 对象 >>> 类 |
| '''注意设置值的情况下是在自身的名称空间中添加或者修改数据''' |
| |
| |
| 名字的查找顺序是 |
| 先从对象自己的名称空间中查找 没有择取产生对象的类中查找 |
| 如果还没有并且类有父类则去父类中查找 以此往复下去!!! |
| 对象 >>> 类 >>> 父类 |
| 经典案例 |
| class A: |
| def f1(self): |
| print('from A.f1') |
| def f2(self): |
| print('from A.f2') |
| self.f1() '''以后看到self点东西 一定要问自己self是谁''' |
| class MyClass(A): |
| def f1(self): |
| print('from MyClass.f1') |
| obj = MyClass() |
| obj.f2() |
| |
| |
多继承情况查找
| |
| """ |
| 在python2中存在经典类与新式类 |
| 在python3中只有新式类 |
| 区分的关键在于是否继承了一个默认的object类 |
| 新式类:直接或者间接继承了object或者其子类的类 |
| 经典类:不继承任何的类 |
| """ |
| class A: |
| pass |
| |
| |
| """ |
| 有时候我们在定义类的时候会习惯性的写 |
| class MyClass(object): |
| pass |
| 为了兼容python2和python3 |
| """ |
| |
| 强度:研究菱形和非菱形问题object不参与图形构建 |
| 非菱形继承的情况下 |
| 父类中名字的查找顺序就是按照继承时从左往右依次查找 |
| 如果多个父类还有分类 那么遵循"深度优先" |
| ADBECF |
| 菱形继承的情况下 |
| 父类中名字的查找顺序就是按照继承时从左往右依次查找 |
| 如果多个父类还有分类 那么遵循"广度优先" |
| ADBECFG |
非菱形
| class D: |
| name = 'from D' |
| pass |
| class E: |
| name = 'from E' |
| class F: |
| name = 'from F' |
| |
| class A(D): |
| name = 'from A' |
| pass |
| class B(E): |
| name = 'from B' |
| class C(F): |
| name = 'from C' |
| |
| class Myclass(A,B,C): |
| # name = 'from MyClass' |
| pass |
| |
| obj = Myclass() |
| print(obj.name) |

菱形
| class G: |
| name = 'from G' |
| |
| class D(G): |
| name = 'from D' |
| pass |
| class E(G): |
| name = 'from E' |
| class F(G): |
| name = 'from F' |
| |
| class A(D): |
| name = 'from A' |
| pass |
| class B(E): |
| name = 'from B' |
| class C(F): |
| name = 'from C' |
| |
| class Myclass(A,B,C): |
| # name = 'from MyClass' |
| pass |
| |
| obj = Myclass() |
| print(obj.name) |
| |

派生类
| class Person: |
| def __init__(self,name,age,gender): |
| self.name = name |
| self.age = age |
| self.gender = gender |
| |
| class Teacher(Person): |
| def __init__(self,name,age,gender,level,salary): |
| |
| |
| super().__init__(name,age,gender) |
| |
| self.level = level |
| self.salary = salary |
| |
| class Student(Person): |
| def __init__(self,name,age,gender,stu_id,class_id): |
| |
| super().__init__(name, age, gender) |
| |
| self.stu_id = stu_id |
| self.class_id = class_id |
| """ |
| 如果自己写的子类需要使用父类的方法 并且还需要基于该方法做扩展 |
| 这样的子类我们称之为派生类(本质还是子类) |
| 那么可以使用super关键字来实现 |
| """ |
| t1 = Teacher('jason',18,'male','满级',3.1) |
| s1 = Student('kevin',28,'female',20220407,2) |
| print(t1.__dict__) |
| print(s1.__dict__) |
重写列表
| class MyClass(list): |
| def append(self,args): |
| if args == 123: |
| print('数字123不能追加') |
| return |
| super(MyClass, self).append(args) |
| obj1 = MyClass() |
| obj1.append(333) |
| obj1.append(222) |
| obj1.append(123) |
| print(obj1) |
| |

【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人