Python面向对象--继承

1. 继承

父类所有的属性和方法,继承后子类几乎(因为私有属性不可以)都可以使用

格式:

class  A:

      pass

class B(A):

      pass

1.1 单层继承

class Mobile:
    can_call = True
    def call(self):
        print('正在打电话')
# SmartPhon 继承 Mobile 类
class SmartPhone(Mobile):
    pass
xiaomi = SmartPhone()
# 所以可以直接使用你类的方法和属性
xiaomi.call()
print(xiaomi.can_call)

运行结果:

某部手机正在打电话
True

 1.2 多层继承

class Mobile:
    can_call = True
    def call(self):
        print('正在打电话')
class SmartPhone(Mobile):
    def call(self):
        print('智能手机正在打电话')
class Iphone(SmartPhone):
    pass
iphone7 = Iphone()
# Iphone 类没有call方法,就会向上一层一层找,SmartPhone 有call方法,所以会打印
iphone7.call()

运行方法:

 智能手机正在打电话

class Mobile:
    can_call = True
    def call(self):
        print('正在打电话')
class SmartPhone(Mobile):
    pass
class Iphone(SmartPhone):
    pass
iphone7 = Iphone()
# Iphone 类没有call方法,就会向上一层一层找,
# SmartPhone 也没有call方法,所以再向上找
# Mobile 类有call方法,所以会打印
iphone7.call()

运行结果:

正在打电话

 总结:当自己有对应的方法或属性,优先使用自己的,如果自己没有,向上一层一层的找

1.3 类的多继承

class Mobile:
    can_call = True
    def call(self):
        print('正在打电话')
class SmartPhone(Mobile):
    def call(self):
        print('智能手机正在打电话')
class MusicPlayer:
    def play_music(self):
        print('正在播放音乐')
class Iphone(SmartPhone,MusicPlayer):
    pass
iphone7 = Iphone()
iphone7.call()
iphone7.play_music()

 运行结果:

智能手机正在打电话
正在播放音乐

 多继承的一个特点是:顺序继承,当继承多个父类时,父类中出现同名的方法,程序会按照继承的顺序

class Mobile:
    can_call = True
    def call(self):
        print('正在打电话')
class SmartPhone:
    def call(self):
        print('智能手机正在打电话')
# 继承父类们有同样方法时,继承时的位置不同,打印出来的结果不同
class Iphone(SmartPhone,Mobile): 
    pass
class Android(Mobile,SmartPhone):
    pass
iphone7 = Iphone()
# 打印的是SmartPhone中的call方法
iphone7.call()
huawei = Android()
# 打印的是Mobile中的call方法
huawei.call()

运行结果:

智能手机正在打电话
正在打电话

2. 方法重写

重写父类的方法

class Mobile:
    can_call = True
    def call(self):
        print('某部手机正在打电话')
class SmartPhone(Mobile):
# 子类重写父类的call方法
    def call(self):
        print('智能手机正在打电话')
xiaomi = SmartPhone()
# 打印出来的是自己重写后的方法
xiaomi.call()

运行结果:

 智能手机正在打电话

3.超继承

格式:

super().父类方法名

class Mobile:
    can_call = True
    def call(self):
        print('正在打电话')
class SmartPhone(Mobile):
    def call(self):
        # 使用父类的方法,再加上自己的
        super().call()
        print('智能手机正在打电话')
xiaomi = SmartPhone()
xiaomi.call()

运行结果:

正在打电话
智能手机正在打电话

4. 动态获取属性

4.1 getattr()

格式:

getattr(类名称,'属性名')  一定要注意属性名要用引号包裹起来

class Mobile:
    color = '白色'
# 类.属性名 调用属性
print(Mobile.color)
# getattr(类名,'属性名')
print(getattr(Mobile,'color'))
# 区别:getattr 属性名可以作字符串传进来
prop_name = input('请输入属性名称:')
print(getattr(Mobile,prop_name))

运行结果:

白色
白色
请输入属性名称:color
白色

 注意:如果输入的属性名称不正确,会报错

4.2 setattr()

格式:

setattr(类名称,'属性名',属性值)  一定要注意属性名要用引号包裹起来

class Mobile:
    color = '白色'
# 设置属性方法一
Mobile.logo = 'apple'
print(Mobile.logo)
# 设置属性方法二
setattr(Mobile,'price',2000)
print(Mobile.price)
# 修改属性方法一
Mobile.color = '红色'
print(Mobile.color)
# 修改属性方法二
setattr(Mobile,'color','黑色')
print(Mobile.color)

 运行结果:

apple
2000
红色
黑色

 总结:没有的属性,第一次设置时,是新增属性,存在的属性,第二次之后是修改属性

猜你喜欢

转载自blog.csdn.net/weixin_40611700/article/details/120503268