web高阶课堂笔记1(深入类和对象)

   日期:2024-12-25    作者:zbzyf 移动:http://oml01z.riyuangf.com/mobile/quote/20969.html

魔法函数总览

str 和 repr 魔法方法的区别

都是打印为字符串类型。
但是str是易读 简单明了。
repr 是给开发人员看的,会显示类的类型。

web高阶课堂笔记1(深入类和对象)

多态的概念:java 和 c# 是这一类是强类型语言。使用时,比如整数1 需要声明类型 int a = 1 。

而 python崇尚鸭子类型【即弱类型语言,也可以称为动态语言】。即只需要a=1即可不需要写明类型。

在调用实例方法时不检查类型,只要方法存在,参数正确就可以调用,即【一个对象只要看起来像鸭子,走路像鸭子,就能看作鸭子。】这一类型就是鸭子类型

python中的多态:定义时的类型和运行时的类型不一样就是多态。

面向对象的三大特征
  • 封装
  • 继承
  • 多态(定义的时候不知道调用的是谁,还有运行的时候才知道调用的是谁。比如a*2,只有运行的时候在知道a代表什么
抽象基类介绍

抽象基类(abstract base class,ABC模块:抽象基类就是 类里定义了纯虚成员函数 的类。**纯虚函数只是提供了借口,并没有具体实现。**抽象基类不能被实例化(不能创建对象,通常是作为基类供子类继承,子类中重写虚函数,实现具体的接口。

抽象基类就是 定义各种方法而不做具体实现的类 ,任何继承抽象基类的类必须实现这些方法,否则无法实例化。

抽象基类应用场景
 
 

先从collections模块【很多数据类型都封装在该模块中】的abc类型中,导入sized类型。

 
 
 

·我们需要强制某个子类必须实现父类的方法

1、直接在父类方法中编写主动抛出异常。

2、使用抽象基类方法完成
导入abc模块,再定义一个类。
首先,使用抽象基类的时候,父类不再是继承object 而是导入abc模块后,继承abc.ABCMeta

抽象基类特点
  • 无法实例化
  • 继承类必须具有抽象基类指定方法
抽象基类应用场景
  • 检查某个类是否有某种方法
  • 强制子类必须实现某些方法

isinstance(对象,判断类型【可以是元组形式填写多个】:判断数据类型,返回布尔值。

比如
a=1
b=‘耗子’
print( isinstance(a,int)或者print( isinstance(a(int,str)【元组形式中可以填写多个数据类型,进行选择判断】

小结
  • type:不考虑继承关系,返回说明类型
  • isinstance:考虑继承关系,返回布尔值
== 和 is 区别

==:值相等(id可不同
is:id相同

如图所示
cls_ins :类属性
self.a 和 send.b:实例属性
当用对象去访问,可以访问类属性和实例属性。因为对象是向上查找

单继承

当对象有该实例属性的时候,直接输出实例属性。
当对象没有该实例属性的时候,才会向上查找,使用类属性。

多继承

自省:通过一定的机制查询到对象的内部结构。

python中比较常见的自省(introspecton)机制(函数用法)有

  • dir()【对象所拥有的所有属性,考虑到继承的成员】
  • type()【数据类型返回说明类型】
  • hasattr()【判断类中是否含有某个方法,返回布尔值】
  • isinstance()【判断数据类型,返回布尔值】

通过这些函数,我们能够在程序运行时得知对象的类型,判断对象是否存在某个属性,反问对象的属性。

在多继承的情况下是根据mro顺序查询,单继承的情况下则是根据父类继承方式查询。

super:子类继承父类后在同个方法名中调用父类的方法时使用。
使用方法:super).方法名

软编码

super():函数可以替代父类名字。比如当父类曾经叫做one 如果在子类调用使用父类名的话需要one().init()。此时当父类改名为two那么子类中的调用也要将one改成two。容易造成不便,所以直接使用super替代。这样只需要修改子类继承的形参中的父类名。

硬编码

不使用super去继承父类的方法,而直接使用类名().方法名() 去调用为硬编码,注意传入的形参中self不能少,不然会报错。

它其实是一种设计模式(开发者之间的共识)。最好遵守。

继承是一个”is-a”关系。比如轿车类继承交通工具类,因为轿车是一个(“is-a”)交通工具。一个物品不可能是多种不同的东西,因此就不应该存在多重继承。不过有没有这种情况,一个类的确是需要继承多个类呢

答案是有,我们还是拿交通工具来举例子,民航飞机是一种交通工具,对于土豪们来说直升机也是一种交通工具。对于这两种交通工具,它们都有一个功能是飞行,但是轿车没有。所以,我们不可能将飞行功能写在交通工具这个父类中。但是如果民航飞机和直升机都各自写自己的飞行方法,又违背了代码尽可能重用的原则(如果以后飞行工具越来越多,那会出现许多重复代码)。

怎么办,那就只好让这两种飞机同时继承交通工具以及飞行器两个父类,这样就出现了多重继承。这时又违背了继承必须是”is-a”关系。这个难题该怎么破

这时候 Mixin 就闪亮登场了。飞行只是飞机做为交通工具的一种(增强)属性,我们可以为这个飞行的功能单独定义一个(增强)类,称之为 Mixin 类。这个类,是做为增强功能,添加到子类中的。为了让其他开发者,一看就知道这是个 Mixin 类,一般都要求开发者遵循规范,在类名末尾加上 Mixin 。


特别提示:本信息由相关用户自行提供,真实性未证实,仅供参考。请谨慎采用,风险自负。


举报收藏 0评论 0
0相关评论
相关最新动态
推荐最新动态
点击排行
{
网站首页  |  关于我们  |  联系方式  |  使用协议  |  隐私政策  |  版权隐私  |  网站地图  |  排名推广  |  广告服务  |  积分换礼  |  网站留言  |  RSS订阅  |  违规举报  |  鄂ICP备2020018471号