python32-继承-名字查找顺序-经典类与新式类
今日学习
对象独有的功能
面向对象三大特性之继承
继承的本质
名字查找顺序
经典类与新式类
派生方法
对象独有的功能
class Persion:
h_type = '人类'
def __init__(self,name): #让对象拥有独有的数据
self.name = name
#定义类中的函数,我们称之为方法
def eat(self): #是多个对象公共的方法,也算多个对象独有的方法,对象来调用就会将数据传入
print('%s正在干饭'%%self.name)
def other(self,a,b):
print('others 哈哈哈')
-------------------------------------------------------
特点
针对对象独有的方法,我们无法真正实现
1.如果在全剧则不是独有的
2.如果在类中则是公共的
python 解释器针对上述问题添加一个非常牛的特性
定义在类中的函数默认是绑定给对象的(相当于对象独有的方法)
动静态方法
-
第一种 : 绑定【对象】的方法调用
对象调用:self
1.1.类里面定义的函数。默认获取绑定对象本身
1.2对象调用时候,默认将对象作为第一个实参传入
1.3类调用的时候需要根据函数形参数个数传参
-----------------------------第一种例子例子------------------------------------
class Student:
school = '清华大学'
# 绑定给对象的方法
def run(self): # self用于接收对象
print('老六赶紧跑!!!', self)
stu1 = Student()
stu1.run()
--------执行结果---------
老六赶紧跑!!! <__main__.Student object at 0x0000027B3C8346A0>
-
第二种 : 绑定类的调用
2.1 跟上内置语法糖@classmethod
类调用:cls
2.2 类调用的时候,默认将类当作第一个参数传入
2.3 就算是对象调用类的方法,也不会出现报错,默认将对象的类当做第一个参数传参。
class Student:
school = '清华大学'
@classmethod # 绑定给类的方法
def eat(cls): # cls用于接收类
print('老六你可真有才', cls)
Student.eat()
-----执行结果--------------
老六你可真有才 <class '__main__.Student'>
-
第三种 : 静态方法 【普普通通的函数】
@staticmethod定义修饰的函数;
有多个形参,就需要传多个实参;
类 和 对象都必须根据形参数进行传参。
class Student:
school = '清华大学'
@staticmethod # 静态方法
def sleep(a, b): # 无论谁来调用都必须按照普普通通的函数传参方式
print('老六快去睡觉吧')
stu1 = Student()
Student.sleep(1, 2)
stu1.sleep(1, 2)
------------执行结果-------------
老六快去睡觉吧
老六快去睡觉吧
面向对象三大特性之继承 (非常重要)
-
三大特性:
1.继承
2.封装
3.多态
----------------
-
1.继承的含义?
1.现实生活角度:人与人直接的资源关系传递
eg:父与子的关系
2.编程的角度:描述类与类直接的数据关系
eg: 类A继承类B(拥有了类B所有的数据和功能)
-
1.2.继承目的?
继承为了节省代码的编写,可以继承一个,也可以继承多个类
-
1.3 如何继承,继承操作?
1.定义类的时候在类名加括号
2.括号里填写哪个类名,就是继承哪个类
3.如果继承多个类,用逗号隔开,从左往右
-
继承的方式
单继承
多继承
-
单继承
----------------------------------例子:-----------------------------------
class Father: #父类
money = 100
def run(self):
print(几百万量车')
class Son(Father): #子类
pass
print(Son.money)
-------执行结果------
100 # 此时Son 继承了Father
-
多继承
------------------------多继承例子---------------------------------------------
class F1:
name = 'from f1'
class F2:
name = 'from f2'
class F3:
name = 'from f3'
class MyClass(F1,F2,F3):
pass
print(MyClass.name) #从左到右掌握父类属性
-
结论:
我们将被继承的类称为:父类或基类或超类
将继承的类称为子类或者派生类
平时使用最多的就是父类和子类
继承的本质
抽象:将多个类共同的数据或功能抽取出来形成一个基类
继承:从上往下白嫖各个基类里面的资源
"""
对象:数据和功能的结合体
类:多个对象相同的数据和功能的结合体
父类:多个类相同的数据和功能的结合体
ps:类和父类最主要的功能其实就是节省代码
"""
一定要掌握继承的本质 这样以后你才会在代码中自己定义出子类父类
数据和方法的查找顺序(重要)
-
1.不继承的情况下名字查找的顺序
---------------------------------------例-子:---------------------------------
class Student:
school = '清华大学'
def choice_course(self):
print('正在选课')
stu1 = Student()
print(stu1.school)
--------执行结果-----------------
清华大学
-----------------------例子2----------------------------------------
class Student:
school = '清华大学'
def choice_course(self):
print('正在选课')
stu1 = Student()
print(stu1.school)
stu1.school = '北京大学'
print(stu1.school)
print(Student.school)
--------执行结果----------
清华大学
北京大学
清华大学
-
单继承的情况下名字查找顺序
-
1.查找顺序。先查询对象自身,再往产生对象的类里查找。
--------------单继承查找------------------------------
class A:
name = 'from A'
class B(A):
name = 'from B'
class C(B)
name = 'from C'
class MyClass(C):
name = 'from MyClass'
obj = MyClass()
print (obj.name)
------------例子2----------------------
class A1:
def func1(self):
print('from A1 func1')
def func2(self):
print('from A1 func2')
self.func1() # obj.func1()
class MyClass(A1):
def func1(self):
print('from MyClass func1')
obj = MyClass()
obj.func2()
------执行结果------------
from A1 func2
from MyClass func1 #'''只要涉及到对象查找名字 几乎要回到最开始的位置依次查找'''
-
总结
多继承名字的查找顺序
1.非菱形继承(最后不会归总到我们自定义类上)
深度优先(每个分支都走到底,再切换)
2.菱形继承 最后归宗到我们一个自定义类的上面
广度优先(前面几个分支都不会走最后一类,最后一个分支才走)
也可以使用类点mro()方法查看该类产生的对象名字的查找顺序
主要涉及到对象查找名字,那么几乎都是
对象自身 类 父类
经典类与新式类
-
经典类
-
不继承object 或者其子类的类(什么都不就成)
-
新式类
-
继承了object 或者其子类的类
-=-======================================================
在python3中所有的类默认都会继承object
也就意味着python3里面只有新式类
在python2中有经典类和新式类
由于经典类没有核心的功能 所以到了python3直接砍掉了
以后我们在定义类的时候 如果没有想要继承的父类 一般推荐以下写法
class MyClass(object):
pass
目的是为了兼容python2
"""
以后写代码针对object无需关心 知道它的存在即可
派生方法
子类中定义类与父类一模一样的方法并且扩展了该功能>>>派生
classs MyClass(list):
def append (self,value):
if value == 'jason':
print('jason 不能追加')
super().append(value)
obj = MyClass()
obj.append(111)
obj.append(222)
obj.append('jason')
obj.append(333)
print(obj)
派生的精髓:当新的问题出现,原有程序无法解决,需要对原有程序进行改造
标签:
python
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具