立即登录

注册账号

联系我们

2021年12月22日 19:13

10.2面向对象继承封装多态

类的继承     人    男人/女人   中国男人/女人

子类继承父类的所有属性和方法
可以增加类属性,可以增加对象属性
可以去新增方法
可以去修改父类的方法

例1:女人类继承人类, 增加新的类属性

class Person:
    def __init__(self,name,age):
        self.name = name
        self.age = age

    def run(self):
        return f"{self.name}会跑"

class Woman(Person): # 女人类继承了人类
    __gender = '女' # 新增了一个私有的类属性
    def __init__(self,name,age):
        super().__init__(name,age) # 调用父类的初始化方法初始化子类

    @property # 将私有类属性通过方法返回,并封装
    def gender(self):
        return self.__gender;

    def say(self):  # 新增了一个方法
        return '我说话声音好听'

ly = Woman('卢炎',19) # 实例化
ly.name # 可以使用父类的属性
ly.run() # 可以调用父类的方法
ly.gender # 可以调用新增的类属性,子类独有
ly.say() # 子类中独有的方法

例2: 男人继承人类, 新增方法, 修改父类方法

# 举一反一,修改父类的方法
class Man(Person):
    __gender = '男' # 新增了一个私有的类属性
    def __init__(self,name,age):
        super().__init__(name,age)

    @property # 将私有类属性通过方法返回,并封装
    def gender(self):
        return self.__gender;

    def say(self):
        return '我说话声音粗犷'

    def run(self): # 修改了父类的方法
        return f"我{self.name}跑的快"


ch = Man('成浩',19)
ch.run() # 调用子类中同名方法.

例3: 子类新增对象属性, 父类对象有的属性, 让父类初始化,  其余的自己初始化

# 增加对象属性,父类对象有的参数,让父类初始化,没有的自己初始化
class Person:
    def __init__(self,name,age):
        self.name = name
        self.age = age
class Man(Person):
    def __init__(self,name,age,height):
        super().__init__(name,age)
        self.height = height

ch = Man('成浩',18, 186)
ch.height

例4: 中国男人继续继承男人类

# 多层继承 
class ChineseMan(Man):
    __nationality = "中国"
    def __init__(self,name,age,height):
        super().__init__(name,age,height)

ch = ChineseMan('成浩',18, height=186)
ch.height

例5: 多态

# 多态, 同一个函数, 传入的对象类型不同, 表现出不同的输出形态
class Pet:
    def __init__(self,name,color):
        self.name = name
        self.color = color
    def say(self):
        return 'hello'

class Dog(Pet):
    kind = "小狗"
    def __init__(self,name,color):
        super().__init__(name,color)
    def say(self):
        return '汪汪汪'
class Cat(Pet):
    kind = "小猫"
    def __init__(self,name,color):
        super().__init__(name,color)
    def say(self):
        return '喵喵喵'

def say(cls,name,color):
    print(cls(name,color).say())

# 多态, 用一个函数, 针对不同对象, 有不同的表现
say(Pet,'小白','白色') # hello
say(Dog,'小白','白色') # 汪汪汪
say(Cat,'小白','白色') # 喵喵喵

例6:设置可变参数, 使用setattr

# 类可变参数传值 setattr
class Pet:
    def __init__(self,name,**kwargs):
        self.name = name
        for attr, value in kwargs.items():
            setattr(self, attr, value)
class Dog(Pet):
    def __init__(self,name,**kwargs):
        super().__init__(name,**kwargs)

xb = Dog('小白',color='白色',age=3)
xb.color

 

留言

给我留言