面向对象继承多态

十九 继承和多态

三大特性:封装、继承、多态

19.1 继承

继承:面向对象的特性之一,通过继承可以让 子类去获得其他类中的属性和方法

# 如何继承?

class 子类名(父类名称)
class Animal:
    def sleep(self):
        print("休息一会儿。。。")
    def eat(self):
        print("吃一会儿东西。。。")


class Dog(Animal):
    def run(self):
        print('狗在奔驰')
d = Dog()
d.eat()
d.sleep()
d.run()


Animal是Dog : 父类
Dog是Animal : 子类

子类可以直接继承父类中已有的属性和方法

意义:可以避免写重复性的代码

  • 内置函数
isinstance(a,b)   判断a对象是不是b类型,包括b的父类
	第一个参数: 对象
    第二个参数: 类名


print(isinstance(d, Dog)) # d是通过Dog创建的对象
print(isinstance(d, Animal)) # d是通过Dog创建的对象
print(isinstance(d, object))    # True


object -> 外号:超类  superclass

存在即合理 object 
所有的__开头的魔法方法,都是object给的

19.2 方法重写

class Animal: # 等价于  class Animal(object):
    def sleep(self):
        print("休息一会儿。。。")
    def eat(self):
        print("吃一会儿东西。。。")


class Dog(Animal):
    def eat(self):
        print("啃骨头")

d = Dog()
d.eat()

当子类实现了父类已经存在的 方法名,会优先执行自己方法

  • 先看自己,再看父类,最后找object

19.3 super

一个内置函数 super() ,可以帮助我们在子类的方法重写中,去调用会被覆盖的父类方法。特别是在 init中经常用

super() 在子类中返回自己的父类,可以直接理解为父类。

class Animal: # 等价于  class Animal(object):
    def __init__(self,name):
        self.name = name

    def sleep(self):
        print("休息一会儿。。。")
    def eat(self):
        print("吃一会儿东西。。。")


class Dog(Animal):
    # 也能够直接继承父类的 init中属性定义
    def __init__(self,name,age):
        super().__init__(name) # Animal.__init__(name) 调用父类的init
        self.age = age #

    def eat(self):
        print("啃骨头")

d = Dog("小哈",12)

print(d.name)
print(d.age)

19.4 多重继承

类—>类–>类–>类

类名.__bases__ 输出自己的父类 
class A:
    pass
class B(A):
    pass
class C(B):
    pass
class D(A):
    pass

19.5 多继承


python 多继承


java和C++ 没有多继承,多重继承

class A:
    def A(self):
        print('我是A')

class B:
    def B(self):
        print('我是B')

class C(B,A):
    def C(self):
        print('我是C')
c = C()

如果多继承用复杂了,怎么去查看 方法的搜索路径?

class A():
    def run(self):
        print('我是A')

class B():
    def run(self):
        print('我是B')

class C(A,B):
    def C(self):
        print('我是C')


# mro方法,会将方法的搜索路径返回
print(C.mro()) 

多态的核心思想:多态性允许我们在不考虑对象具体类型的情况下,使用统一的接口或方法来操作不同类型的对象

多态允许统一的接口(speak方法)允许不同类型的对象在相同的操作下表现出不同的行为

19.6 多态

多态:对象的不同形态

- 哈士奇
- 金毛
- 中华田园犬
- ...

多态:鸭子类型 : 如果有一个东西走路像鸭子,叫声像鸭子,那么就是鸭子

len() # 作用获取对象的长度



lis = [3,4]
s = "hello world"
class Dog:
    def __len__(self):
        return 100
d = Dog()

# len 只关心 对象有没有 __len__()
print(len(d))

三大特性总结

  • 封装

    • 将属性藏起来,只对外界暴露必要的属性,不必要可以自己去控制
  • 继承

    • 允许一个类从另一个类继承属性和方法,从而实现代码的复用和拓展
  • 多态

    • 允许使用统一的接口来操作不同的对象,从而使得代码更加灵活和可扩展
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值