周结(11.6)
面向对象
编程思想
1.面向过程编程
按照固定的流程解决问题(注册功能、登录功能)
2.面向对象编程
面向对象编程,对象即容器,数据与功能的解决方案
两者没有优劣之分,需要结合实际需求而定,如果需要注册、登录、人脸识别肯定面向过程更合适,如果需求是游戏人物肯定是面向对象更合适。
类与对象
面向对象并不是一门新的技术,针对面向对象设计了新的语法格式,python中一定先有类,才能借助于类产生对象
1.语法格式
class 类名:
"""代码注释"""
对象公共的数据
对象公共的功能(方法)
1.class 是定义类的关键字
2.类名的命名与变量名几乎一致,需要注意的是>>>首字母推荐大写用于区分
3.数据:变量名与数据值的绑定,功能(方法)其实就是函数
2.类的定义与调用
类在定义阶段就会执行类体代码,但是属于类的局部名称空间,外界无法直接调用
类的定义
# 需求:人民大学选课系统
class Student:
# 对象公共的数据
school_name = '人民大学'
# 对象公共的功能
def choice_course(self):
print('学生选课功能')
类的调用>>>产生对象
""" 类名加括号就会产生对象,并且每执行一次都会产生了一个全新的对象"""
# 1.类名加括号>>>对象
obj1 = Student() # <__main__.Student object at 0x0000028783BF3B50>
obj2 = Student() # <__main__.Student object at 0x0000028783BF3AF0>
obj3 = Student() # <__main__.Student object at 0x0000028783C00100>
print(obj1,obj2,obj3) # 变量名obj1接收类名加括号之后的返回值(结果)
# 2.通过对象点__dict__ 得到的是空的字典 ,这个字典并不是真是的字典
print(obj1.__dict__) # {} 目前对象是空的
print(obj2.__dict__) # {}
print(obj3.__dict__) # {}
# 3.通过对象点类内的变量名 >>>:变量名绑定的数据值
print(obj1.school_name) # 人民大学
print(obj2.school_name) # 人民大学
print(obj3.school_name) # 人民大学
# 4.类名修改类体代码内中的变量名绑定的数据值school_name
Student.school_name = '江南大学'
print(obj1.school_name) # 江南大学
print(obj2.school_name) # 江南大学
print(obj3.school_name) # 江南大学
>>>>数据和功能 也称属性
>>>>数据 也称属性名
>>>>功能 也称方法
动静态方法
在类中定义的函数有多种特性
class Student:
school_name = '江南大学'
# 1.类中直接定义函数 默认绑定给对象 类调用有几个参数传几个 对象调用第一个参数就是对象自身
def func1(self):
print('from func1')
# 2.被@classmethod修饰的函数 默认绑定给类 类调用第一个参数就是类自身 对象也可以调用并且会自动将产生该对象的类当做第一个参数传入
@classmethod
def func2(cls):
print('from func2',cls)
# 3.普普通通的函数 无论是类还是对象调用 都必须自己手动传参
@staticmethod
def func3(a):
print('from func2',a)
obj = Student()
# 1.绑定给对象的方法
# obj.func1() # from func1
# Student.func1(123) # from func1
# 2.绑定给类的方法
# Student.func2() #等同于func2(Student) from func2 <class '__main__.Student'>
# obj.func2() # 等同于func2(Student) from func2 <class '__main__.Student'>
# 3.静态方法
Student.func3(321) # from func2 321
obj.func3(321) # from func2 321
面向对象的三大特性
面向对象的三大特性
封装 继承 多态
1.继承的含义
在编程世界中继承表示类与类之间资源的从属关系
2.继承的目的
在编程世界中类A继承类B就拥有了类B中所有的数据和方法使用权限
1.在定义类的时候类名后面可以加括号填写其他类名 ,意味着继承其他类
class B(A):
pass
2.在python支持多继承,在括号内填写多个类名彼此逗号隔开即可
class B(A1,A2,A3):
pass
"""
1.继承其他类的类 B
我们称为之为子类、派生类
2.被继承的类 A,A1,A2,A3
我们称之为父类、基类、超类
我们最常用就是父类与子类
"""
继承的本质
本质1:对象:数据和功能的结合体
类(子类):多个对象相同数据和功能的结合体
父类:多个类(子类)相同数据和功能的结合体
>>>>:类与父类本质都是为了节省代码
本质2:继承的本质应该分为两部分
抽象:将多个类相同的东西抽出去形成一个新的类
继承:将多个类继承刚刚抽取出来的新的类
对象查找名字的顺序
1.不继承情况下名字的查找顺序
2.单继承情况下名字的查找顺序
3.多继承情况下名字的查找顺序
"""
对象查找名字的顺序
1.先从自己的名称空间中查找(产生的对象)
2.自己没有再去产生该对象的类中查找
3.如果类中也没有 那么直接报错
对象自身 >>> 产生对象的类
"""
多继承情况下的情况有:
1.菱形继承
广度优先(最后才会找闭环的定点)
2.非菱形继承
深度优先(从左往右每条道走完为止)
ps:mro()方法可以直接获取名字的查找顺序
查找的顺序:
对象自身 >>> 产生对象的类 >>> 父类(从左往右)
强调:
对象点名字 永远从对象自身开始一步步查找
以后在看到self.名字的时候 一定要搞清楚self指代的是哪个对象
经典类和新式类
经典类:不继承object或者其子类的类
新式类:继承object或者其子类的类
python2中有经典类和新式类
python3中只有新式类(所有类默认都继承object)
"""
class Student(object):pass
ps:以后我们在定义类的时候 如果没有其他明确的父类 也可能习惯写object,为了兼容
基于继承的派生方法
子类基于父类某个方法做了扩展
1.子类通过调用父类的方法,通过 super().init(name, age, gender)
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, hobby,level):
super().__init__(name, age, hobby)
self.level = level
# 1.子类调用父类的方法
# stu1 = Student('jason', 18, 'male')
# print(stu1.__dict__) # {'name': 'jason', 'age': 18, 'gender': 'male'}
# tea1 = Teacher('tony', 28, 'female')
# print(tea1.__dict__) # {'name': 'tony', 'age': 28, 'gender': 'female'}
# 2.子类调用父类的方法 子类在自己类中添加数据
stu1 = Student('jason', 18, 'male', 532626)
print(stu1.__dict__) # {'name': 'jason', 'age': 18, 'gender': 'male', 'sid': 532626}
tea1 = Teacher('tony', 28, 'female', 96)
print(tea1.__dict__) # {'name': 'tony', 'age': 28, 'gender': 'female', 'level': 96}
2.通过对象添加数据
class MyList(list):
def append(self, values):
if values == 'jason':
print('jason不能尾部追加')
return
super().append(values)
obj = MyList()
print(obj, type(obj)) # [] <class '__main__.MyList'>
obj.append(111)
obj.append(222)
obj.append(333)
obj.append('jason') # jason不能尾部追加
# print(obj) # [111, 222, 333]
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧