学堂笔记013-面向对象02

Python学堂 - 面向对象02

一、继承简介

继承是面向对象的三大特征之一
我们使用继承可以获取到另一个类的属性和方法
在定义类的时候,我们可以在类名的括号中指定当前类的父类(超类,基类)
继承:
1.1、让类与类之间产生了关系,有了这个关系看,才有了多态的特性
1.2、提高代码的复用性
1.3、父类中所有的方法都会被子类继承,包括特殊方法
2、继承的使用
在创建类的时候,如果省略了父类,则默认父类是object
object是所有类的父类,所有类都继承于object
issubclass() —> 检测一个类是否是另一个类的子类(是就返回True,不是就返回False)

	增加类的数量,增加方法的数量:
	方案一、直接修改类,在这个类中添加我们需要的功能
	(修改起来比较麻烦,并且会违反ocp原则)
	方案二、直接创建了一个新的类
	(创建一个新的类比较麻烦,会出现大量的重复性代码)
	发现类都有相似的地方,
	方案三、直接从类中继承它的属性和方法

总结:
继承是面向对象的三大特性之一
继承可以获得其他类的属性和方法
提高了类的复用性,让类与类之间产生了关系

二、方法重写

如果子类中有和父类重名的方法,则通过子类去调用该方法时,
会调用的是子类里面的方法,这个特点我们称之为方法的重写(覆盖,override)

当我们调用一个对象的方法时,
会优先去当前的对象寻找是否有该方法,如果有则直接调用,
如果没有,则去当前对象的父类中去寻找该方法,如果父类中有该方法,则直接调用父类中的方法,
如果没有,则去父类中的父类去寻找该方法,以此推论,直到找到object中,如果没有则报错。

总结:
方法的重写(覆盖)
子类的方法会覆盖父类的方法

三、super()

语法:
super().__init__(name)
super().__init__(父类的属性)不需要传递self

希望可以直接调用父类的__init__的方法来初始化父类中定义的属性
一种动态的方式获取父类
可以用来获取当前类的父类并且通过super()调用父类方法时,不需要传递self
总结:
可以动态的获取当前类的父类,不需要传递self
可以获取当前父类的属性,不需要传递self

四、多重继承(提议少用)

语法:class 类名(父类,父类,…)

语法:class 类名(父类,父类.....)
class Dog(Animal,Dogs)
	pass

语法__bases__可以获取当前类所有的父类

语法:__bases__
可以获取当前类所有的父类
print(C.__bases__)

Python中是支持多重继承的,也就是我们可以为一个类同时指定多个父类
可以在类名后的括号()中添加多个类,实现多重继承
多重继承,会使子类同时拥有多个父类,并且会获取到所有父类的方法
如果多个父类中有同名的方法,优先去第一个父类寻找,然后第二个,以此推论,找不到就会报错
总结:
一个类指定多个父类
如果多个父类中有重名的方法,优先找第一个,在找第二个一次推论

五、多态

多条是面向对象三大特性之一
一个对象可以以不同的形态去呈现
多种形态

class A:
    pass
class B:
	pass
class C:
    pass
def speak(obj):
    #增加类型检查
    if isinstance(obj,A):
        print('你好%s'%obj.name)
speak(a)

在speak2()我们做了一个类型检查,也就是只有obj是A类型的对象,才可以使用
其他类型的对象,无法使用该函数,所以这个函数违反了多态
违反了多态的函数,只适用于一种类型的对象,无法处理其他类型的对象。这样导致这个函数的适用性很差

	拓展知识:鸭子类型(“当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就可以被称为鸭子。”)
	1、在程序设计中,鸭子类型(Duck typing)是动态类型和某些静态语言的一种对象推断风格
	2、在不使用鸭子类型的语言中,我们可以编写一个函数,它接受一个类型为鸭的对象,并调用它的走和叫方法。
	3、在使用鸭子类型的语言中,这样的一个函数可以接受一个任意类型的对象,并调用它的走和叫方法。
	如果这些需要被调用的方法不存在,那么将引发一个运行时错误。
	4、任何拥有这样的正确的走和叫方法的对象都可被函数接受的这种行为引出了以上表述,这种决定类型的方式因此得名
	5、"鸭子类型"像多态一样工作,但是没有继承。
	6、它不关注对象的类型,而是关注对象具有的行为(方法)
	不足:"鸭子类型"没有任何静态检查,如类型检查、属性检查、方法签名检查等。

总结:
多态是面向对象的三大特性之一
多态程序可以接受任意数据
多态=鸭子类型

六、面向对象三大特性总结

1、封装=确保对象中的数据安全
把数据封装起来,给你看你就能看,不给你看你就不能看
2、继承=保证了对象的可拓展性
是对一个类进行拓展
3、多态=保证了程序的灵活性
就是让我们方法的更灵活,只要满足某个条件就可

未完待续。。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值