面向对象汇总

本周内容概要

  • 面向对象前戏之人狗大战
  • 两种编程思维
  • 类与对象
  • 动静态方法
  • 面向对象之继承
  • 面向对象之派生

本周内容详情

面向对象前戏之人狗大战

人狗大战>>>引出了面向对象
推导过程:
1.定义出人和狗的字典 但要创多个人或狗就会重复的编辑信息
2.将产生人和狗的字典封装成函数,并定义出人打狗或者狗咬人的动作 但没有指定就会出现人用狗的动作 狗用人的动作
3.让人只能调人的攻击动作,狗只能调狗的攻击动作(数据与功能的绑定)
总结:
将人的数据跟人的功能绑定在一起
将狗的数据跟狗的功能绑定在一起

以上得出 面向对象的核心思想:数据与功能的绑定

两种编程思想

1.面向过程编程
过程就是流程  面向过程编程就是按照固定的流程解决问题
即 按照指定的步骤依次执行 最终得到想要的结果
2.面向对象编程
对象就是 容器 里面是数据与功能的结合体(万物皆对象)
但只负责创造出人物及功能 至于后续发展如何不知道
"""
面向过程编程:相当于让你给出一个问题的具体解决方案
面向对象编程:相当于让你创造出一些事物,之后不用你管
"""

# 两者无好坏,需结合具体需求
# 如需求是注册登录   面向过程合适
# 如需求是游戏人物   面向对象更合适

类与对象

1.类与对象的概念

对象:数据与功能的结合体 对象才是核心

类:多个对象相同数据与功能的结合体 类主要是为了节省代码

2.类与对象创建

现实中一般是现有个体(对象),再有群体(类)
程序中必须先定义类,再产生对象

面向对象本质就是将数据和功能绑定在一起,为了突出面向对象编程,python专门设计了新的语法格式

2.1类的语法结构

class 类名:
    对象公共的功能
    对象公共的功能
1.class 是定义类的关键字
2.类名的命名和变量名一致,'首字母要大写'为了函数名区别
3.数据  变量名与数据值的绑定
  功能   也叫方法 其实就是函数

2.2类的定义与调用

1.类在定义阶段就会执行类体代码,但是类的局部名称空间外界无法直接调用
2.类和对象获取内部数据的方法可以统一采用:句点符
3.类名()就会产生对象,每执行一次就会产生一个新的对象

2.3对象独有的数据

推导流程:
1.通过利用__dict__的方法来向字典添加键值对 由于代码重复
2.将添加独有数据的代码封装成函数 任何对象都可以调用给数据的函数
3.给学生对象添加独有数据的函数只有学生对象有资格调用  
4.init变形
当内部有__init__时:
类名会把产生的空对象和参数一起传给__init__
然后给对象添加独有的数
5.变量名修改

2.4对象的独有的功能(实例化)

就是只能将函数放在类中 但是类中的函数又是对象公共的 
定义在类中的功能 默认就是绑定给对象使用的 谁来调谁就是主人公
注意:
  1.类调用功能需自己传一个参数
  2.对象调用功能会自动将对象当作第一个参数传入

动静态方法

在类中定义函数有三种

1.类中直接定义函数

默认是绑定给对象的方法

1.1对象调用会自动将对象当作第一个参数传入

1.2类调用需要手动将对象当作第一个参数传入

self 用来接收对象

2.被@classmethod修饰的函数

默认是绑定给类的方法

2.1类调用会自动将类当第一个参数传入

2.2对象调用会将产生该对象的类当作第一参数传入

cls 用来接收类

3.被@staticmethod修饰的函数

会变成普通的函数 被@staticmethod修饰 也叫静态方法

注意:无论是对象还是类调用 有多少参数就传多少参数

面向对象之继承

1.继承的概念

面向对象的三大特性 :封装 继承 多态

继承 含义 目的
现实 用来表示人与人之间资源的关系 占有别人的财产
编程 用来表示类与类之间数据的关系 类A拥有类B中所有数据和方法的使用权

2.继承的基本操作

2.1.定义类的时候类名后加括号填写其他类名,意味着可以去继承该类

2.2.当要继承多个类的时候,括号里需逗号隔开

被继承的类:#父类、基类、超类
继承类的类:#子类、派生类

3.继承的本质

 对象:数据与功能的结合体
 子类:多个对象相同数据和功能的结合体
 父类:多个子类相同数据和功能的结合体
子类与父类的本质就是为了节省代码

继承的本质:
抽象:将多个类相同的东西抽出去形成一个新的父类
继承:让子类继承刚刚抽出去的父类
就是把相同的代码抽出来变成一个父类,其他类想用的时候就变成子类继承父类,子类可以调用父类中的资源

4.对象查找名字的顺序

4.1不继承的情况

对象自身 >>> 该对象的类

4.2 单继承的情况

对象自身 >>> 该对象的类 >>> 父类

4.3多继承的情况

1.菱形继承
 广度优先(从左到右每条道不会走最后闭合的点,最后才会走)
2.非菱形继承
深度优先(从左到右每条道走完为止)
ps:print(类.mro())方法可以获取名字查找顺序

5.经典类与新式类

object中有类必备的所有功能

经典类:不继承object或其子类的类
新式类:继承了object或其子类的类

#在python2中有经典类和新式类
    由于经典类中没有核心的功能所以在python3中就取消了
    
#在python3中只有新式类
    '所有的类'默认都继承了object

今后在定义类时,如果没有要继承的父类就写继承object!目的时为了兼容python2

面向对象之派生

子类基于父类又做了扩展可以简单理解成:想用别人的方法,又觉得别人方法不够

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

class Student(Person):
    def __init__(self, name, age, play):
        super().__init__(name, age)  # 子类调用父类的方法
        self.play = play # 自己补充的数据

obj = Student('jason', 18, 'run')
print(obj.__dict__)  # {'name': 'jason', 'age': 18, 'play': 'run'}


练习:扩展列表尾部追加方法(不能追加jason)

class Mylist(list):
    def append(self, v1):
        if v1 == 'jason':
            print('不能追加jason')
            return
        super().append(v1)

obj = Mylist()
print(obj, type(obj))  # [] <class '__main__.Mylist'>
obj.append(1)
print(obj)  # [1]
obj.append('jason')
print(obj) # 不能追加jason [1]
posted @ 2022-11-06 14:38  hugmi男孩  阅读(21)  评论(0)    收藏  举报