继承
python中支持多重继承,一个子类可以继承多个直接父类
class 子类类名(父类1[父类2,...])
类体
object是所有类的父类
class Person:
def __init__(self, name, age):
self.name = name
self.__age = age
def say_age(self):
print(self.__age)
class Student(Person): # 继承person
def __init__(self, name, age, score):
Person.__init__(self, name, age) # 必须显示的调用父类初始化方法,不然解释器不会调用
self.score = score
s = Student("LiMing", 20, 99)
s.say_age()
# print(s.age)
print(s._Person__age) # 如果age是私有,可以被继承 只能通过这种方式调用
print(s.score)
方法重写
子类重新定义父类的方法
class Person:
def __init__(self, name, age):
self.name = name
self.__age = age
def say_age(self):
print(self.__age)
def say_name(self):
print(self.name)
class Student(Person): # 继承person
def __init__(self, name, age, score):
Person.__init__(self, name, age) # 必须显示的调用父类初始化方法,不然解释器不会调用
self.score = score
# 重写学生say_name方法
def say_name(self):
print("hi teacher,my name is {0}".format(self.name))
s = Student("LiMing", 20, 99)
s.say_name()
object根类
dir() 查看对象属性
Person继承了object的所有属性
重写__str__()方法
查看对象信息
重写之前
class Person: # 继承object
def __init__(self, name):
self.name = name
s = Person("LiMing")
print(s)
返回值为:<main.Person object at 0x000001D2E2B73B80>
重写之后
class Person: # 继承object
def __init__(self, name):
self.name = name
def __str__(self):
return ("name is {0}".format(self.name))
s = Person("LiMing")
print(s)
返回值为:name is LiMing
多重继承
一个子类可以有多个直接父类,但是这样类的层次结构异常复杂,尽量避免使用
mro()
python 支持多继承,如果父类中有相同名字的方法,在子类没有指定父类名时,解释器将从左向右按数据搜索
mro:方法解析顺序
class A:
def aa(self):
print("aa")
def say(self):
print("aa say")
class B:
def bb(self):
print("bb")
def say(self):
print("bb say")
class C(B, A):
def cc(self):
print("cc")
c=C()
c.aa()
c.bb()
c.cc()
print(C.mro())
c.say()
返回值:
aa
bb
cc
[<class ‘main.C’>, <class ‘main.B’>, <class ‘main.A’>, <class ‘object’>]
bb say
B类在左侧,优先使用B类的方法:
super()获取父类的定义
class A:
def say(self):
print("aa say")
class B(A):
def say(self):
A.say(self)
super().say() #与前面效果一致
print("bb say")
b=B()
b.say()
返回值:
aa say
aa say
bb say