Day 21
'''
如果一个类继承另外一个类
该类叫做子类(衍生类),被继承的类叫做父类(基类,超类)
继承:(1)单继承(2)多继承
python中,所有的类都默认继承父类object
'''
class Human(object):
hair='黑色'
sex='男'
def cry(self):
print('人类在伤心的时候,会留下鳄鱼的眼泪')
def eat(self):
print('人类在远古的时候,抓住猎物直接吃')
def __makebaby(self):
print('人类在发育到成熟的时候,会造人')
class Man(Human):
pass
obj=Man()
print(obj.hair)
obj.cry()
'''
子父继承之后,
如果子类里面有该成员属性和方法,优先调用自己的
如果没有该成员,调用父类中的成员
如果都没有,直接报错
'''
class Children(Human):
sex='女性'
def cry(self):
print('小孩只会哇哇哇的哭')
obj=Children()
obj.cry()
print(obj.__dict__)
print(Children.__dict__)
class Father():
property='风流倜傥,一表人才'
def f_hobby(self):
print('社会摇,大保健')
class Mother():
property='成语落雁,闭月羞花'
def m_hobby(self):
print('喝酒抽烟烫头')
class Daughter(Father,Mother):
pass
obj=Daughter()
print(obj.property)
obj.m_hobby()
'''
super本身就是一个类,super()是一个对象,用于调用父类的绑定方法
super()只应用在绑定方法中,默认自动传递self对象(前提:super所在的作用域存在self)
super用途解决繁杂的多继承调用顺序
'''
class Father():
property='风流倜傥,一表人才'
def f_hobby():
print('社会摇')
class Mother():
property='闭月羞花'
def m_hoddy(self):
print('打麻将')
class son(Father,Mother):
property='王者荣耀'
def skill1(self):
Father.f_hobby()
print(Mother.property)
def skill3(self):
self.m_hoddy()
print(self.property)
'''
super()只调用父类的相关公有成员,不会调用自己的本类成员,父类没有直接报错
super()在调用父类方法时,只调用父类的绑定方法,默认传递参数是本类的对象self
'''
def skill3(self):
print(super().property)
super().m_hobby()
obj=Son()
obj.skill1()
obj.skill2()
obj,skill3()
'''
self 和 super() 的区别
self
在调用成员时,先看看自己的类对象中是否存在该成员,
如果有调用自己的,如果没有,调用父类的,如果都没有直接报错
super()
在调用成员时,只调用父类的相关成员(属性,绑定方法)
永远不会调用自己的。如果父类没有,直接报错
'''
'''
Human
Man Women
Children
'''
class OldWomen():
pass
class Human():
pty=4
def feelT(self):
print('原始人类如果热了,脱皮1')
print(self.pty)
print('原始人类如果冷了,扒别人的皮2')
class Man(Human):
pty=3
def feelT(self):
print('现代男人如果热了,脱衣服,脱了裤子3')
super().feelT()
print('现代男人如果冷了,脱别人的衣服,脱别人的裤子4')
class Women(Human):
pty=2
def feelT(self):
print('现代女人如果热了,吹空调5')
super().feelT()
print('现代女人如果冷了,喝热水6')
class Children(Man,Women):
def feelT(self):
print('现代小孩如果热了,就会哭7')
super().feelT()
print('现代小孩如果冷了,也要哭8')
obj.Children()
obj.feelT()
'''
类.mro()
返回来的是方法调用顺序列表,针对于多继承下的同名方法
按照顺序依次的进行调用
'''
lst=Children.mro()
print(lst)
'''只要在一条继承链上即可(有血缘关系)'''
res=issubclass(Children,Man)
print(res)
res=issubclass(Children,Women)
print(res)
res=issubclass(Children,Human)
print(res)
res=issubclass(Children,(Human,Women,Man,OldWomen))
print(res)
res=issubclass(Children,OldWomen)
print(res)
'''只要在一条继承链上即可(有血缘关系)'''
res=isinstance(obj,Children)
print(res)
res=isinstance(obj,Human)
print(res)
res=isinstance(obj,(Human,Children,Women))
print(res)
res=isinstance(obj,OldWomen)
print(res)
'''
触发时机:实例化对象,初始化的时候触发
功能:为对象添加成员
参数:参数不固定,至少一个self参数
返回值:无
'''
class MyClass():
def __init__(self):
print('初始化的时候的触发')
self.name='bajie'
obj.MyClass()
print(obj.name)
class MyClass():
def __init__(self,name):
self.name=name
obj=MyClass('bajie')
print('obj.name')
print(obj.name)
'''
一个类可以实例化多个不同的对象,而对象和对象之间彼此独立
但都可以使用类中的公有的成员
'''
class Children():
def __init__(self,name,skin):
self.name=name
self.skin=skin
def cry(self):
print('小孩出生就哇啊啊哇哇哇的哭')
def drink(self):
print('小孩出生就要喝奶奶')
def __la(self):
print('拉粑粑')
def pub_info(self):
print('该对象的名字是{},该对象的肤色是{}'.format(self.name,self.skin))
afanda=Children('阿凡达','蓝色的')
afanda.pub_info()
afanda,cry()
afanti=Children('阿凡提','黄色的')
anfanti.pub_info()
anfanti.drink()