python的多态与super

python多态与super

1、多态的概念

1)多态(Polymorphism):同名方法呈现多种行为

2、运算符的多态表现

1)+号
    加法:数字+数字
    拼接:字符串+字符串
    合并:列表+列表
# 加法:数字+数字
print(1 + 1)  # 打印 2
# 拼接:字符串+字符串
print("Hello" + "World")  # 打印 Hello World
# 合并:列表+列表
print([1, 2] + [3])  # 打印 [1, 2, 3]

3、函数的多态表现

1)len()函数:返回对象(字符、列表、元组等)长度或项目个数
    * 可以接收字符串
    * 可以接收列表 
# 参数是字符串
print(len("Hogwarts"))
# 参数是列表
print(len([1, 3, 5]))

4、方法的多态表现

同名变量调用同名方法呈现多种行为
class China:
    def speak(self):
        print("汉语")

class Usa:
    def speak(self):
        print("英语")

# 实例化对象
cn = China()
us = Usa()

for x in (cn, us):
    # 同一个变量在调用同名方法时,呈现不同的行为
    # 具体呈现哪种行为,由该变量所引用的对象决定
    x.speak()

5、多态与继承

1)方法重写(Override):子类的方法名称与父类的相同
2)重写构造方法
    super().__init__()
    父类名.__init__(self)
class Human:
    """人类"""

    message = "这是Human的类属性"

    # 构造方法
    def __init__(self, name, age):
        # 实例属性
        self.name = name
        self.age = age

    # 实例方法
    def live(self):
        print(f"住在地球上")

class Student(Human):
    """学生类"""

    # 重写父类的构造方法
    def __init__(self, name, age, school):
        # 访问父类的构造方法
        super().__init__(name, age)
        # super(Student, self).__init__(name, age)
        # Human.__init__(self, name, age)
        # 子类实例属性(个性)
        self.school = school

    # 重写父类的实例方法
    def live(self):
        print(f"住在{self.school}")

# 实例化子类对象
stu = Student("哈利波特", 12, "Hogwarts")
# 访问实例方法
stu.live()  # 将会打印 住在Hogwarts