动静态方法
| 在类中定义的函数有多种特性 |
| class Student: |
| school_name = '摆烂大学' |
| |
| def func1(self): |
| print('看谁最能摆烂 真的好棒棒!!!') |
| |
| |
| @classmethod |
| def func2(cls): |
| print('嘿嘿嘿 猜猜我是干嘛滴', cls) |
| |
| |
| @staticmethod |
| def func3(a): |
| print('哈哈哈 猜猜我又是什么', a) |
| |
| obj = Student() |
| |
| |
| |
| |
| Student.func2() |
| obj.func2() |
| |
| |
| |
面向对象之继承的概念
| """ |
| 面向对象三大特性 |
| 封装 继承 多态 |
| 1.三者中继承最为核心(实操最多 体验最强) |
| 2.封装和多态略微抽象 |
| """ |
| 1.继承的含义 |
| 在现实生活中继承表示人与人之间资源的从属关系 |
| eg:儿子继承父亲 干女儿继承干爹 |
| 在编程世界中继承表示类与类之间资源的从属关系 |
| eg:类A继承类B |
| 2.继承的目的 |
| 在现实生活中儿子继承父亲就拥有了父亲所有资源的支配权限 |
| 在编程世界中类A继承类B就拥有了类B中所有的数据和方法使用权限 |
| 3.继承的实操 |
| class Son(Father): |
| pass |
| 1.在定义类的时候类名后面可以加括号填写其他类名 意味着继承其他类 |
| 2.在python支持多继承 括号内填写多个类名彼此逗号隔开即可 |
| class Son(F1, F2, F3): |
| pass |
| """ |
| 1.继承其他类的类 Son |
| 我们称之为子类、派生类 |
| 2.被继承的类 Father F1 F2 F3 |
| 我们称之为父类、基类、超类 |
| ps:我们最常用的就是子类和父类 |
| """ |
继承的本质
| """ |
| 对象:数据与功能的结合体 |
| 类(子类):多个对象相同数据和功能的结合体 |
| 父类:多个类(子类)相同数据和功能结合体 |
| ps:类与父类本质都是为了节省代码 |
| """ |
| 继承本质应该分为两部分 |
| 抽象:将多个类相同的东西抽出去形成一个新的类 |
| 继承:将多个类继承刚刚抽取出来的新的类 |
名字的查找顺序
| 1.不继承情况下名字的查找顺序 |
| class C1: |
| name = 'jason' |
| |
| def func(self): |
| print('from func') |
| |
| obj = C1() |
| |
| obj.name = '你迷了吗' |
| print(obj.__dict__) |
| print(obj.name) |
| print(C1.name) |
| """ |
| 对象查找名字的顺序 |
| 1.先从自己的名称空间中查找 |
| 2.自己没有再去产生该对象的类中查找 |
| 3.如果类中也没有 那么直接报错 |
| 对象自身 >>> 产生对象的类 |
| """ |
| |
| 2.单继承情况下名字的查找顺序 |
| |
| |
| |
| |
| |
| |
| |
| ''' |
| 对象自身 >>> 产生对象的类 >>> 父类 |
| ''' |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| class A1: |
| def func1(self): |
| print('from A1 func1') |
| |
| def func2(self): |
| print('from A1 func2') |
| self.func1() |
| |
| class B1(A1): |
| def func1(self): |
| print('from B1 func1') |
| |
| obj = B1() |
| obj.func2() |
| """ |
| 强调:对象点名字 永远从对象自身开始一步步查找 |
| 以后在看到self.名字的时候 一定要搞清楚self指代的是哪个对象 |
| """ |
| |
| 3.多继承情况下名字的查找顺序 |
| 菱形继承 |
| 广度优先(最后才会找闭环的定点) |
| 非菱形继承 |
| 深度优先(从左往右每条道走完为止) |
| ps:mro()方法可以直接获取名字的查找顺序 |
| ''' |
| 对象自身 >>> 产生对象的类 >>> 父类(从左往右) |
| ''' |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| ''' |
| 对象自身 >>> 产生对象的类 >>> 父类(从左往右) |
| ''' |
| class G: |
| name = 'from G' |
| pass |
| class A: |
| |
| pass |
| class B: |
| |
| pass |
| class C: |
| |
| pass |
| class D(A): |
| |
| pass |
| class E(B): |
| |
| pass |
| class F(C): |
| |
| pass |
| |
| class S1(D,E,F): |
| pass |
| obj = S1() |
| |
| |
| print(S1.mro()) |
经典类与新式类
| """ |
| 经典类:不继承object或者其子类的类 |
| 新式类:继承object或者其子类的类 |
| 在python2中有经典类和新式类 |
| 在python3中只有新式类(所有类默认都继承object) |
| """ |
| class Student(object):pass |
| ps:以后我们在定义类的时候 如果没有其他明确的父类 也可能习惯写object兼容 |
派生方法
| 子类基于父类某个方法做了扩展 |
| |
| class Person: |
| def __init__(self, name, age, gender): |
| self.name = name |
| self.age = age |
| self.gender = gender |
| |
| |
| class Student(Person): |
| def __init__(self, name, age, gender, sid): |
| super().__init__(name, age, gender) |
| self.sid = sid |
| |
| |
| class Teacher(Person): |
| def __init__(self, name, age, gender, level): |
| super().__init__(name, age, gender) |
| self.level = level |
| |
| |
| stu1 = Student('jason', 18, 'male', 666) |
| print(stu1.__dict__) |
| tea1 = Teacher('tony', 28, 'female', 99) |
| print(tea1.__dict__) |
| |
| |
| |
| class MyList(list): |
| def append(self, values): |
| if values == 'jason': |
| print('jason不能尾部追加') |
| return |
| super().append(values) |
| |
| obj = MyList() |
| print(obj, type(obj)) |
| obj.append(111) |
| obj.append(222) |
| obj.append(333) |
| obj.append('jason') |
| print(obj) |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)