day24

今日内容

继承介绍

以及继承的基本用法

 

继承

  什么是继承?

    是一种新建类的方法,新建的类叫子类/派生类,被继承的类叫父类/基类/超类

    特点:

      1、子类遗传/继承父类的属性

      2、一个子类可以继承多个父类

      3、在继承的背景下,子类分为两种:新式类、经典类

      注:python2中会区分,在python3中所有类都默认继承object,所以在python3中所有类都是新式类

      经典类:没有继承object的类,以及该类的子类……都叫经典类

      新式类:就是继承了object的类,以及该类的子类……都叫新式类

     使用继承这种方式的好处:可以大大减少代码冗余

#########################################################

class Parent1(object):
pass

class Parent2(object):
pass

class Sub1(Parent1):#sub1继承了parent1
pass

class Sub2(Parent1,Parent2):#sub2继承了parent1和parent2
pass

print(Parent1.__bases__)#__bases__可以查看改类继承了那些类
print(Parent2.__bases__)
print(Sub1.__bases__)
print(Sub2.__bases__)

#########################################################

利用继承可以解决代码之间的冗余

首先,需要抽象出该父类下的子类的相同点,

然后,在父类中的__init__设置好子类的相同属性(因为子类可以公用父类的这些属性)

最后,再派生出一个个子类。

############################################################

class 动物:

  def 吃(self):

   pass 

  def 喝(self):

   pass 

  def 拉(self):

   pass 

  def 撒(self):

   pass 

 

class 狗(动物):

  def 叫声:

    print(‘汪汪汪’)

 

class 猫(动物):

  def 叫声:

    print(‘喵喵喵’)

 

##############################################################

在子类的派生的新方法中,重用父类的功能方式一:

  指名道姓的使用某一类中的函数

总结:

1、与继承无关

2、访问类的函数,没有自动传值的效果

##########################################

class zjnu:
school = 'zjnu'

def __init__(self,name,age,sex):
self.name = name
self.age = age
self.sex = sex

class Student(zjnu):
def __init__(self, name, age, sex, score=0):
zjnu.__init__(self,name,age,sex)
self.score = score


class Teacher(zjnu):
def __init__(self,name,age,sex,level):
zjnu.__init__(self,name,age,sex)
self.level=level

##################################################

在单继承的背景下,属性查找的优先级

对象==>对象的类==>父类==>父类……

#####################################################

class Foo:
def f1(self):
print('Foo.f1')

def f2(self):
print('Foo.f2')
self.f1() #obj.f1()

class Bar(Foo):
def f1(self):
print('Bar.f1')

obj=Bar()
obj.f2()
'''
Foo.f2
Bar.f1
'''

#####################################################

在多继承的背景下,属性查找的优先级:

如果一个子类继承多个分支(多个子类没有共同继承一个非object的类)

此时属性查找的优先级:对象==>对象的类==>从左到右的顺序一个一个按照分支查找

############################################################

# 第四层:
class G:
# x = 'G'
pass

# 第三层
class E(G):
# x = 'E'
pass

class F:
# x = 'F'
pass

# 第二层
class B(E):
# x = 'B'
pass

class C(F):
# x = 'C'
pass

class D:
# x = 'D'
pass

# 第一层
class A(B, C, D):
# x = 'A'
pass

obj = A()
# obj.x = 111
print(obj.x)

##############################################################

菱形查找问题:

新式类:一个个按照从左到右的顺序查找,最后再查找顶级类

经典类:一个个按照从左到右的顺序查找,直接查找到顶级类

 

 

python专门为新式类内置了一个mro的方法,用来查看c3算法(属性查找的规律的一种算法)的计算结果

  在子类派生的新方法中重用父类功能的方式二:

  在python2中:super(自己的类名,自己的对象)

  在python3中:super()

  调用该函数会得到一个特殊的对象,该对象专门用来访问父类中的属性(完全参照mro列表)

  总结:

    1、严格依赖继承的mro列表

    2、访问时绑定方法,有自动传值的效果

##############################################################

class zjnu:
school = 'zjnu'

def __init__(self,name,age,sex):
self.name = name
self.age = age
self.sex = sex

class Student(zjnu):
def __init__(self, name, age, sex, score=0):
super(Student,self).__init__(name,age,sex)
self.score = score

class Teacher(zjnu):
def __init__(self,name,age,sex,level):
super().__init__(name,age,sex)
self.level=level
stu1=Student('lay',38,'male')
print(stu1.__dict__)

tea1=Teacher('ybg',88,'male',10)
print(tea1.__dict__)

 

#############################################################

posted @ 2018-08-20 17:31  yyxxff  阅读(170)  评论(0编辑  收藏  举报