python学习第21天

一.面向对象-继承

继承:一个类除了自身所拥有的属性方法之外,还获取了另外一个类的成员属性和方法

子类:一个类继承另外一个类,也叫做衍生类

父类:被继承的类叫做父类,也叫做基类,超类

继承分为

1)单继承

2)多继承

python中所有的类都默认继承父类object

1.1单继承

class Human(object):
   hair = "金色"
   sex = "男"
   
   def eat(self):
      print("人类天生就喜欢吃吃吃")
      
   def la(self):
      print("人类天生就喜欢拉拉拉")
      
   def __makebaby(self):
      print("人类天生就能够繁衍后代")

(1)子父继承之后,子类可以调用父类所有的公有成员

class Man(Human):  #class  Man(父类)
   pass
   
obj = Man() # Man(构造方法的参数)
print(obj.hair) # 金色

(2)子父继承之后,子类不可以调用父类的私有成员

class Woman(Human): 
   def pub_makbaby(self):
      self.__makebaby()
   
obj = Woman()
obj.eat()
# obj.__makebaby() 不行
# obj.pub_makbaby()不行

(3)子父继承之后,子类可以重写父类的同名方法

子父继承后

如果子类里面有该成员属性方法,优先调用自己的

如果没有该成员,那么调用父类的公有成员

如果都没有直接报错

class Children(Human):
   sex = "女性"
   def eat(self):
      print("小孩下生只能吃奶奶~")
   
obj = Children()
print(obj.sex)
obj.eat()

1.2多继承

(1)基本语法

class Father():
   property = "玉树临风,风流倜傥,一枝梨花压海棠"
   def f_hobby(self):
      print("吃喝嫖赌抽,坑蒙拐骗偷,抽烟喝酒烫头")

class Mother():
   property = "沉鱼落雁,闭月羞花,一枝红杏出墙来"
   def m_hobby(self):
      print("打麻将,敷面膜,跳广场舞")
      
class Daughter(Mother,Father): 
   pass
   
# 实例化对象
obj = Daughter() 
print(obj.property)
obj.m_hobby()

(2) super用法

super本身是一个类,super()是一个对象,用于调用父类的绑定方法

super()只应用在绑定方法中,默认自动传递self对象(前提:super所在作用域存在self)

super用途:解决复杂的多继承调用顺序

1.3菱形继承

super在菱形继承中调用子类上一层级所有的父类,都调用完了再找上一层级的父类调用,然后在依次返回调用结果

    Human
Man         Woman
   Children
class BigMan():
   pass

class Human():
   pty = 4
   def feelT(self):
      # self 此刻接受的是Children的对象
      print("原始人类天热了,让后裔把太阳射下来1")
      print(self.pty) #  obj.pty = 1
      print("原始人类天冷了,让女娲补天,防止漏风2")
   
class Man(Human):
   pty = 3
   def feelT(self):
      # self 此刻接受的是Children的对象
      print("现代男人天热了,吹吹空调3")
      super().feelT()
      print("现代男人天冷了,吹暖气4")
      
class Woman(Human):
   pty = 2
   def feelT(self):
      # # self 此刻接受的是Children的对象
      print("现代女人天热了,洗洗澡5")
      super().feelT()
      print("现代男人天冷了,吃雪糕6")
   
class Children(Man,Woman):
   pty = 1
   def feelT(self):
      print("现代小朋友天热了,洗海澡7")
      # super()调用方法时候,会携带者当前类的对象进行传递
      super().feelT()
      print("现代小朋友天冷了,钻被窝8")
      
   
obj = Children()
obj.feelT()
打印结果
现代小朋友天热了,洗海澡7
现代男人天热了,吹吹空调3
现代女人天热了,洗洗澡5
原始人类天热了,让后裔把太阳射下来1
1
原始人类天冷了,让女娲补天,防止漏风2
现代男人天冷了,吃雪糕6
现代男人天冷了,吹暖气4
现代小朋友天冷了,钻被窝8

(1)mro列表 : super用途的体现,解决复杂的多继承调用顺序

类.mro() 返回的是方法调用顺序的列表,针对于多继承下的同名方法,按照列表的顺序依次调用

lst = Children.mro()
print(lst)
"""[<class '__main__.Children'>, <class '__main__.Man'>, <class '__main__.Woman'>, <class '__main__.Human'>, <class 'object'>]"""

(2) issubclass判断是否存在子父关系(语法使用与isinstance一模一样)

只要在一个继承链上即可(有血缘关系即可)应用范围在类的身上

res = issubclass(Children,Man)
res = issubclass(Children,Woman)
res = issubclass(Children,Human)
res = issubclass(Children,BigMan)
res = issubclass(Children , (Man,Woman,Human,BigMan))
print(res)

(3) isinstance 判断类型

只要在一个继承链上即可(有血缘关系即可),是在判断对象和类之间的关系

res = isinstance(obj,Children)
res = isinstance(obj,Man)
res = isinstance(obj,Woman)
res = isinstance(obj,BigMan) # False
print(res)

__ dict __返回的是一个字典,类或者对象的所有成员

用 in 来判断成员在不在这个类或者对象中

猜你喜欢

转载自www.cnblogs.com/yunchao-520/p/12976580.html
今日推荐