课堂笔记15(面向对象编程:成员、属性、方法。继承、多态)

面向对象成员

类的成员

在这里插入图片描述

属性

实例属性

实例属性:属于对象,只能通过对象访问
定义:Self.属性名称
例如:self.name. self.age 都是实例属性

访问:self.属性名称 或者 对象.属性名称
在这里插入图片描述
弊端:
每创建一个对象的时候都要传入默认的self.country = ‘中国’,会造成内存消耗的浪费。此时,就需要用到类属性。多个对象都是属于中国这个类的。

类属性

类属性(静态属性):属于类,保存在类中,在创建时,仅创建一份,并且所有对象都共享静态属性。执行时可以是类访问也可以是对象访问。

定义:直接在类中定义(在类中,在类的方法外面)

访问:类名.属性名称 或 self.属性名称 或 对象.属性名称
在这里插入图片描述

属性总结

在实际开发中,如果属性的值是固定的,不随对象的改变而改变。那就使用静态属性(类属性),这样有利于节省内存消耗。而如果属性的值随对象的改变而改变,就使用实例属性。

方法

实例方法

实例方法:普通方法保存在类中,在实例化对象后,一般通过对象调用。第一个参数必须为系统自建参数,默认为self,代指对象本身。

注意:

  • 当需要在方法中使用实例属性【self.属性名】时,通常使用实例方法。
  • self仅仅是变量名。使用其他也可,但最好不要修改。
    在这里插入图片描述

类方法

类方法:通过在方法上面添加@classmethod装饰器,保存在类中。
注意:

  • 类方法不需要传入self。但是有一个系统自建参数cls,cls代指类本身。
  • 类方法一般通过类调用,也可以通过对象调用。

在这里插入图片描述

扫描二维码关注公众号,回复: 12657381 查看本文章

静态方法

静态方法:通过在方法上面添加@staticmethod装饰器定义,保存在类中。
注意:

  • 静态方法不需要传入self参数,即使传入self参数,也并不像普通方法那样指代对象本身,仅仅是一个普通的形参。
  • 静态方法的调用虽然可以通过对象调用,但一般有类调用。
  • 静态方法的参数并不代表对象这一特点,使静态方法在类中使用起来更像一个单数的函数。完全可以将静态方法放在类的外部,当成函数使用。但是放在类中,便于使用与维护。

在这里插入图片描述
在这里插入图片描述

封装

封装:是面向对象编程的一大特点,将属性和方法放到类的内部,通过对象访问属性或者方法,隐藏功能的实现细节,也可以设置访问权限。
在这里插入图片描述

继承

继承:是一种创建新类的方式,如果子类需要复用父类的属性或者方法时,就可以使用继承。当然,子类也可以提供自己的属性和方法。

继承的作用是为了减少代码的重复。
注意:在python中新建的类可以继承一个或者多个父类
在这里插入图片描述

新式类与经典类

在python2当中类分为新式类和经典类,如果有继承父类object则是新式类,否则为经典类。
但,在python3中,全部都是新式类,默认继承object。

object:是包含了各种方法,所以要在python3中创建类,可以在类中输入各种方法,因为python3全部都是新式类,默认继承了object。
在这里插入图片描述

对象._ dir _()查看对象属性与方法

在python3中比较继承与无继承这两个空类的成员是否一致使用:对象._ dir _()查看对象属性与方法
在这里插入图片描述
在这里插入图片描述

单继承

单继承:子类继承父类,则可以直接享受父类中已经封装好的方法。

深度优先机制:单继承对象调用方法,查找顺序先从自身类找,如果自身类没有,则去父类找,父类没有,再去父类的父类找,直到object类,若还没有,则报错。【代码是从上至下执行的,所以越往下越深,就称为深度优先】

例:题目如下图
在这里插入图片描述
解析:
在这里插入图片描述
在这里插入图片描述
报错图如下:
在这里插入图片描述

继承方法的重写

当子类与父类的方法名相同时,就意味重写父类的方法。
比如上图中,爷爷类sleep要睡10小时。
在父类中添加sleep方法,写要睡8小时。
当子类调用sleep方法时,就是打印为8小时而不是10小时,因为被重写了。【也可以看成,深度优先机制因为在子类中找到了sleep方法所以执行了sleep方法,而不再往上去查找sleep方法】
在这里插入图片描述

super()函数

在子类和父类拥有同一种名称的方法时,子类对象调用该方法优先执行自身的方法。那么实际上就是子类方法覆盖父类的方法,所以称为重写。

但是,实际开发中,遵循开放封闭原则。并不会完全重写父类的方法,而是希望同时实现父类的功能。这就需要调用父类的方法,就通过 super()函数

super(type [,object-or-tpype])用于调用父类(超类)的一个方法
type:类
ojbect-or-type:对象或类,一般是self
在这里插入图片描述

单继承小结

  1. 单继承深度优先机制

  2. 重写(防止执行父类中的方法),在子类中与父类方法同名

  3. self永远指的是执行该方法的调用者在这里插入图片描述

  4. super(当前类,self).父类中的方法(arg)

  5. _ init_初始化方法(创建对象时会自动执行该方法,为对象属性设置初始值)可以继承,同实例方法一致,深度优先在这里插入图片描述

  6. 私有属性(_ _属性名)不能被继承

  7. 私有方法(_ _方法名)不能被继承

多继承

多继承:子类有多个父类,并且具有它们的特征(继承的父类们的属性和方法)。

场景1:左边优先

在这里插入图片描述

当子类多继承几个父类的时候,如果两个父类都有同一种方法名,遵循左边优先原则。
在这里插入图片描述在这里插入图片描述

场景2:左边一条路走到底

在这里插入图片描述

先左边优先,之后在左边寻找方法,左边子类的父类如果没有,则往子类的父类所继承的类中去找。直到左边的继承类都查完也没有后,才开始执行右边父类。
在这里插入图片描述

场景3:父类同根时根最后执行

在这里插入图片描述
同根源时,优先执行根下的同名方法(类似方法重写)。都没该方法后再执行根的方法。
在这里插入图片描述

_ mro_ 方法(c3算法)

_ mro_:了解算法的实现,算法的执行顺序或者继承顺序
在这里插入图片描述

多继承小结

  1. 左边优先【广度优先】
  2. 先左边一条路走到底,再走右边【深度优先】
  3. 同一根时,根在最后执行【广度优先】
  4. c3算法。_mro _算法的实现

多态

多态:应用于jave和c#这一类强类型语言中,而python崇尚“鸭子类型”

动态语言调用实例方法时不检查类型。只要方法存在、参数正确,就可以调用。这就是动态语言的“鸭子类型”,它并不要求严格地继承体系,一个对象只要“看起来像鸭子,走起路来像鸭子”,那么久可以被看作是鸭子。

所谓多态:定义时的类型和运行时的类型不一样,此时就成为多态。

图文解析:
通过一个外部函数,达成了多个类的调用。
在python中不同功能的函数使用相同功能的函数名,就可以用一个函数名调用不同功能的函数。
图中。外部函数print_self()就是多态的体现。通过与两个不同功能,但是,方法名相同的函数来达到,用一个函数打印出两个结果。

obj形参接收了方法的实参传参。 将每个类的对象传入方法中,达到了方法的调用。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/yuuisei/article/details/113181890
今日推荐