Welcome to kimi's blog

周结(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]
posted @   魔女宅急便  阅读(19)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
Title
点击右上角即可分享
微信分享提示

目录导航