马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
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)
我曾经跨过山和大海,也穿过人山人海~
都有自行车了,要什么宝马?
|