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
红色
黑色
总结:没有的属性,第一次设置时,是新增属性,存在的属性,第二次之后是修改属性