周结之面向对象

周结

  • 编程思想
  • 面向对象之类与对象
  • 静态方法
  • 面向对象之继承
  • 继承的本质
  • 名字的查找顺序
  • 经典类与新式类
  • 派生方法

编程思想

​ 面向过程编程:都需要列举每一步流程 并且随着步骤的深入 问题的解决越来越简单化
​ 面向对象编程:类似一个造物主的感觉 只需要造出一个个对象 至于该对象将来会如何发展跟程序员没有关系 也无法控制
PS:两种思想没有优劣之分 需要结合实际需求而定 两种思想是彼此交融的 只不过占比不同

面向对象之类与对象

对象:数据与功能的结合体 对象才是核心
​ 类:多个对象相同数据和功能的结合体 类主要是为了节省代码
​ 类与对象的关系:类包含一系列对象 对象属于某个类
​ 在程序中如果想要产生对象就必须先要定义出类
​ 在面向对象编程时 第一步就思考余姚什样的对象 对象具备什么样的特征和行为从而根据这些信息总结出需 要的类型

类与对象的创建

python中一定要有类才能借助于类产生对象
1.类的语法格式:
class 类名:
    '''代码注释'''
    对象公共的数据
    对象公共的功能
class是定义类的关键字
类名的命名与变量名几乎是一致的 但首字母推荐是大写用于区分
数据:变量名与数据的绑定 功能(函数)其实就是函数
2.类的定义与调用
类在定义阶段就会执行类体代码 但是属于类局部名称空间 外界无法直接调用
'''在面向对象中 类和对象访问数据或者功能 统一采用句点符'''
'''类名加括号就会产生对象 并且每一次都会产生全新的的对象(我将类产生对象的过程叫做对象的实例化)'''
'''数据和功能也可以统称为属性  数据>>>属性名  功能>>>方法'''

对象独有的数据与功能

# 独有的数据
__init__:初始化方法__init__
当时实例化对象时会自动执行init方法 会自动将对象作为第一个参数传入 参数名称
'''
__init__ 执行流程:
1.类加括号产生一个对象
2.将类括号内的参数和空对象交给__init__执行空对象作为第一个参数
3.该方法会给独有的数据并自动返回对象本身
'''
# 独有的功能
定义在类中的功能 默认就是绑定给对象使用的 谁来调谁就是主人公

动静态方法

1.绑定给对象的方法
类中直接定义函数 默认绑定给对象 对象调用第一个参数就是对象本身
2.绑定给类的方法
被@classmethod修饰的函数默认绑定给类的 类的调用第一个参数就是类自身 对象也可以调用并且将产生该对象的类当做第一个数传入
3.静态方法 通过被@staticmethod修饰的函数 无论是函数还是对象本身 都必须自己手动传参

面向对象之继承的概念

​ 面向对象的三大特征:
​ 封装 继承 多态
​ 三者中继承最为核心
在编程世界中类A继承类B就拥有了类B所有的数据和方法使用权
在定义类的时候后面加括号填写其他类名 编号继承其他类
在python中支持多继承 括号内填写多个类名彼此逗号隔开
继承了其他类的类称之为子类、派生类
被我们继承的类称之为父类、基类、超类

继承的本质

对象:数据与功能的结合体
类(子类):多个相同数据和功能的结合体
父类:多个类相同数据和功能的结合体
继承本质应分两部分
抽象:将多个类相同的东西抽出去形成一个新的类
继承:将多个类继承刚刚抽取出来的类

名字的查找顺序

分不继承与单继承、多继承情况下的名字查找顺序

  1. 不继承
    对象自身 >>> 产生对象的类
  2. 单继承
    对象自身 >>> 产生对象的类 >>> 父类
  3. 多继承
    对象自身 >>> 产生对象的类 >>> 父类(从左往右)
    分:菱形继承、非菱形继承
    菱形:广度优先(最后才会找闭环的定点)
    非菱形:深度优先(从左往右每一条道走完为止)
    PS:mro()方法点类名可以直接获取名字的查找顺序

经典类与新式类

经典类:不继承object或者其子类的类
新式类:继承object或者其子类的类
	在python2中有经典类和新式类
    在python3中只有新式类(所有类默认都继承object)
PS:在定义类的时候 如果没有其他明确的父类 也可能习惯写object来实现兼容

派生方法

子类基于父类某个方法做了扩展
class Peron:
    school_name = '北京大学'
    def __init__(self, name, age, hobby):
        self.name = name
        self.age = age
        self.hobby = hobby
    def func(self):
        print(self.name)
class Student(Person):
    def __init__(self, name, age, hobby, level):
    	super().__init__(self, name, age, hobby) # 子类调用父类的方法
        self.level = level
        
 stu1 = Student('jason', 18, 'read', 99)
posted @ 2022-11-06 18:46  小福福  阅读(17)  评论(0编辑  收藏  举报