继承
继承的概念:子类将包含父类所有的属性和方法
class People(object):
def __init__(self,name,age):
self.name=name
self.age=age
def speak(self):
print("你好")
class Men(People):
def __init__(self,name,age,high):
People.__init__(self,name,age)
self.high=high
def jieshao(self):
print(f"我的名字是{self.name}")
xiaoming=Men("小明",18,85)
xiaoming.speak()
xiaoming.jieshao()
结果为: 你好 我的名字是小明
如果子类调用父类的私有属性或方法就会报错 如果子类想用父类的私有属性或方法,必须 一个下划线+父类名+俩个下划线+私有属性或方法
class People(object):
def __init__(self,name,age):
self.__name=name
self.age=age
def speak(self):
print("你好")
class Men(People):
def __init__(self,name,age,high):
People.__init__(self,name,age)
self.high=high
xiaoming=Men("小明",18,85)
xiaoming.speak()
print(xiaoming._People__name)
类成员的继承和重写 成员继承:子类继承父类除构造方法之外的成员 重写:子类可以重新定义父类中的方法,从而覆盖父类的方法
class People(object):
def __init__(self,name,age):
self.name=name
self.age=age
def speak(self):
print("你好")
class Men(People):
def __init__(self,name,age,high):
People.__init__(self,name,age)
self.high=high
def speak(self):
print(f"我的名字是{self.name}我的身高是{self.high}")
xiaoming=Men("小明",18,85)
xiaoming.speak()
结果为: 我的名字是小明我的身高是85
通过类方法mro()或者类的属性下划线+mro+下划线输出这个类的继承结构
class a():
pass
class b(a):
pass
class C(b):
pass
print(C.mro())
结果为: [<class ‘main.C’>, <class ‘main.b’>, <class ‘main.a’>, <class ‘object’>]
内置函数dir()可以查看内置函数
class People(object):
def __init__(self,name,age):
self.name=name
self.age=age
def speak(self):
print("你好")
class Men(People):
def __init__(self,name,age,high):
People.__init__(self,name,age)
self.high=high
def speak(self):
print(f"我的名字是{self.name}我的身高是{self.high}")
print(dir(Men))
python可以多继承,即有多个父类,如果俩个父类具有相同的方法名,在子类没有指定父类时,从左到右按顺序搜索
在子类中如果想获取父类方法时,可以用super()
class Dog(object):
def __init__(self,name,shengying):
self.name=name
self.shengying=shengying
def jiao(self):
print("汪汪汪")
class xiaotianquan(Dog):
def __init__(self,name,shengying):
super().__init__(name,shengying)
def xxx(self):
print("okokok")
a=xiaotianquan("aaa","汪汪汪")
a.jiao()
结果为:汪汪汪
class Dog(object):
def __init__(self,name,shengying):
self.name=name
self.shengying=shengying
def jiao(self):
print("汪汪汪")
class xiaotianquan(Dog):
def __init__(self,name,shengying):
super().__init__(name,shengying)
def jiao(self):
print("okokok")
a=xiaotianquan("aaa","汪汪汪")
a.jiao()
结果为okokok 如果在子类定义了和父类一样名称的方法,则子类覆盖父类
class Dog(object):
def __init__(self,name,shengying):
self.name=name
self.shengying=shengying
def jiao(self):
print("汪汪汪")
class xiaotianquan(Dog):
def __init__(self,name,shengying):
super().__init__(name,shengying)
def jiao(self):
print("okokok")
super().jiao()
a=xiaotianquan("aaa","汪汪汪")
a.jiao()
结果为: okokok 汪汪汪
super().方法 表示父类的方法
私有属性和私有方法不能被外界和子类调用
|