QQ登录

只需一步,快速开始

开启左侧

Python学习第五十七天—类和对象6-多态和鸭子类型

[复制链接]
15271953841 发表于 2024-3-21 06:13:57 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
Python 3.12.1 (tags/v3.12.1:2305ca5, Dec  7 2023, 22:03:25) [MSC v.1937 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license()" for more information.
一、面向对象的最后一个特征——多态,它是指同一个运算符、函数和对象在不同的场景下,具有不同的作用效果,这么一个技能。
(一)这是运算符的多态

3+5
8
3*5
15
"Py" + "FishC"            (字符串拼接)
'PyFishC'
"FishC" * 3                (重复拷贝了)
'FishCFishCFishC'           (“+”号和“*”号这种见机行事的行为,我们称之为多态。)
(二)len函数也是多态的
len("FishC")                (得到字符串的字符的个数)
5
len(["FishC","Python","Me"])
3                           (得到列表中元素的个数)
len({"name":"小姐姐","age":18})
2                             (得到列表中键(key)的个数)
多态尽管接口不变,它去能够根据不同的对象执行不同的操作。
(三)类继承的多态
Python允许我们在子类中定义和父类同名的方法,如果我们对某个父类的方法不满意,完全可以在子类中重新定义一个同名的方法进行一个覆盖,那么这种操作我们之前讲过叫重写,重写就是类继承的多态。

class Shape:
    def __init__(self,name):
        self.name = name
    def area(self):
        pass

class Square(Shape):
    def __init__(self,length):
        super().__init__("正方形")         (需要一个name)
        self.length = length
    def area(self):
        return self.length * self.length

class Circle(Shape):
    def __init__(self,radius):
        super().__init__("圆形")
        self.radius = radius
    def area(self):
        return 3.14 * self.radius * self.radius

   
class Triangle(Shape):
    def __init__(self,base,height):
        super().__init__("三角形")
        self.base = base
        self.height = height
    def area(self):
        return self.base * self.height / 2

   
s = Square(5)
c = Circle(6)
t = Triangle(3,4)
s.name                     (这个name是访问属性)
'正方形'
c.name
'圆形'
t.name           (这里的正方形、圆形、三角形都是继承于Shape类,但是它们又重写了构造函数area方法,这个就是多态的体现)
'三角形'
s.area()                      (这个是访问方法)
25
c.area()
113.03999999999999
t.area()
6.0
再看看自定义函数是如何实现多态接口:
class Cat:
    def __init__(self,name,age):
        self.name = name
        self.age = age
    def intro(self):
        print(f"我是一只沙雕猫咪,我叫{self.name},我今年{self.age}岁~")
    def say(self):
        print("mua~")

        
class Dog:
    def __init__(self,name,age):
        self.name = name
        self.age = age
    def intro(self):
        print(f"我是一只小狗,我叫{self.name},我今年{self.age}岁~")
    def say(self):
        print("哟吼~")

        
class Pig:
    def __init__(self,name,age):
        self.name = name
        self.age = age
    def intro(self):
        print(f"我是一只小猪,我叫{self.name},我今年{self.age}岁~")
    def say(self):
        print("oink~")

        
c = Cat("web",4)
d = Dog("布布",7)
p = Pig("大肠",5)

def animal(x):           (animal函数,x是动物的对象)
    x.intro()              (方法)
    x.say()               (方法)

   
animal(c)                      (这个animal函数就是具有多态性了,该函数接受不同的对象作为参数,并且不检查其类型的情况下执行它的方法)
我是一只沙雕猫咪,我叫web,我今年4岁~
mua~
animal(d)
我是一只小狗,我叫布布,我今年7岁~
哟吼~
animal(p)
我是一只小猪,我叫大肠,我今年5岁~
oink~
多态它是一种特性,由于Python是一门动态语言,所以多态本来就是Python自身的一种特性。

二、鸭子类型
比如我们这个animal函数,它不需要关注它这个参数是什么东西,只要这x里面有intro和say这两个方法,它就不会报错,我们再来定义一下:

class Bicycle:
    def intro(self):
        print("我曾经跨过山和大海,也穿过人山人海~")
    def say(self):
        print("都有自行车了,要什么宝马?")

        
b = Bicycle()
animal(b)
我曾经跨过山和大海,也穿过人山人海~
都有自行车了,要什么宝马?

客服热线
400-1234-888 周一至周日:09:00 - 21:00
公司地址:襄阳市樊城区长虹路现代城5号楼188

创客帮MAKER.BAND青少年创客创意社区是一个融教育、科技、体育资讯为一体的综合服务平台,专注于教育创新、专注于科技体育、专注于教育资讯。

Powered by Discuz! X3.4 © 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表