子类可以拥有多个父类,并且具有所有父类的属性和方法
class 子类名(父类名1,父类名2...)
pass
class A:
def test(self):
print("这是第一个父类")
class B:
def demo(self):
print("第二个父类")
class C(A, B):
pass
# 创建一个子类对象
cc = C()
cc.demo()
cc.test()
Python中的MRO --方法搜索顺序
Python中针对类提供了一一个内属性_mro_可以查看方法搜索顺序
●MRO是method resolution order, 主要用于在多继承时判断方法、属性的调用路径
print(C._ mro_ )
输出结果
(
●在搜索方法时,是按照_mro_ 的输出结果从左至右的顺序查找的
●如果在当前类中找到方法,就直接执行,不再搜索
●如果没有找到,就查找下一个类中是否有对应的方法,如果找到,就直接执行,不再搜索
●如果找到最后一个类,还没有找到方法,程序报错
多态
不同的子类对象调用相同的父类方法,产生不同的执行结果
●多态可以增加代码的灵活度
●以继承和重写父类方法为前提
●是调用方法的技巧,不会影响到类的内部设计
class Dog(object):
def __init__(self, name):
self.name = name
def game(self):
print("%s玩耍" % self.name)
class XiaoTianDog(Dog):
def game(self):
print("%s飞在天上玩耍" % self.name)
class Person(object):
def __init__(self, name):
self.name = name
def game_with_dog(self, dog):
print("%s和%s玩耍" % (self.name, dog.name))
dog.game()
#创建狗对象
#wangcai = Dog("旺财")
wangcai = XiaoTianDog("飞天哮天犬")
#创建人对象
xiaoming = Person("小明")
xiaoming.game_with_dog(wangcai)
静态方法
●在开发时,如果需要在类中封装-个方法,这个方法:
既不需要访问实例属性或者调用实例方法,也不需要访问类属性或者调用类方法
这个时候,可以把这个方法封装成一个静态方法
class Dog(object):
@staticmethod
def run():
# 不访问实例属性/类属性
print("小狗要跑")
# 通过类名.调用静态方法,不需要创建对象
Dog.run()
实例方法和类方法
# 设计一个Game类,定义一个类属性top_score 记录最高分,
# 实例属性player_name记录当前游戏的玩家姓名
class Game(object):
# 类属性
top_score = 0
def __init__(self, player_name):
self.player_name = player_name
# 静态方法
@staticmethod
def show_help():
print("帮助信息:让僵尸进入")
# 类方法
@classmethod
def show_top_score(cls):
print("历史记录 %d" % cls.top_score)
# 对象的实例方法
def start_game(self):
print("%s 开始游戏" % self.player_name)
# 查看游戏的帮助信息
Game.show_help()
# 查看最高分
Game.show_top_score()
# 创建游戏对象
zhangsan = Game("张三")
zhangsan.start_game()



