day25

 今日内容:

     1.什么是继承?

         在python中继承的特点?单继承&多继承

          python2与python3在继承上的区别

2. 为何继承?

3. 如何继承

   先抽象再继承

4.属性查找的顺序

5. 派生?

     在子类派生出的新属性中如何重用父类功能的两种方式

6.  组合

" " "

1.什么说继承?

   在程序中继承是一种新建类的方式,新创建的类称之为子类派生类,被继承的类称之为父类基类超类

   继承描述的是一种遗传关系,子类可以重用父类的属性

2, 为何用继承?

   减少类与类之间代码沉余的问题

3. 如何继承

  先抽象再继承

 " " "

在python中继承的特点?单继承&多继承

 class parent1(object):

 pass



 class Sub1(parent1):

  pass



 class sub2(parent,parent2):

       pass

 

  print(Sub1._bases_)

  print(Sub2._bases_)



 print(parent1._bases_)

 print(parent2._bases_)

 

 x=2

 class Foo:

     # x=1

         pass

 obj=Foo()

 obj.x=3

 print(obj.x)

 python2与python3在继承上的区别

 新式类:但凡继承object类的子类,以及该子类的子子类,.....都称之为新式类

经典类:没有继承object类的子类,以及该子类的子子类,......都称之为经典类

 只有在python2中才区分新式类与经典类

 新式与经典在属性查找上的区别???

 在子类派生的新功能中如何重用父类的功能:

 方式一:指名道姓地访问某一个类中的函数,与继承无关

class 0ldboypeople:

    school = 'oldboy'

    def_init_(self,name,age,gender):

        self.name = name

         self.age = age

         self.gendef = gender

 
 def choose_course(self):

       print('%s is choosing course'%self.name)

 
class Oldboy Teacher(Oldboypeople):

          tea, 'egon',18,'male',10,3000

     def_init_(self,name,age gender,level,salary):

               self.name = name

                self.age = age

                self.gender = geder

Oldboypeople._init_(self,name,age,gender)

    

self,level=level

      self,salary=salary
 def score(self,stu,nam):

          stu.num=num

          print('老师'%s‘给学生’%s‘打分’%s’%(self.name,stu.name,num))

 

  stu = Oldboystdent('kevin',38',male') #_init_(stu1,'kevin,'38,'male')

print(stu._dict_)

tea=,;egon',18,'male',10,3000)

print(stu._dict_)

 print(stu.school)

print(tea.school)  

   在单继承背景下,无论是新式类还是经典类属性查找顺序都一样

 先obj->类->父类->....

class foo:

  def f1(self):

    print('Foo.f1')

    def f2(self):

    print('Fpp.f2')

    self,f1() #obj.f1()

 

 class Bar(Foo):

    def f1 (self):

           print('Bar.f1)



 obj=Bar()

 obj.f2()

 

在多类背景下,如果一个子类继承了多个分只,但是多个分只没有汇聚到一个非object类,无论是新式类还是经典类属性查找顺序都一样:

 会按照从左到右的顺序一个分只一个分只的查找下去

class E:

       xxx='E'

        pass

 

class F:

  xxx='F'

    pass

 

class B(E):

          xxx='B'

             pass

class C(F):

         xxx='C'

           pass

class D:

     xxx='D'

        pass

class A(B,C,D):

            xxx='A'

               pass

 

 obj A=()

 obj.xxx=111

 print(obj.xxx)

 

print(A.mro())

 

 在多继承背景下,如果一个子类继承多了多个分只,但是多个分只最终汇聚到一个非object类

 新式类:广度优先查找:->A->B->C->E->C->F->D->G->0bject

经典类: 深度优先找查找:obj->A->B->E->G->C->F->D

 class G:

    xxx='G'

   class E(G):

     pass



  class F(G):

    xxx='E'

        passs



 class B(G)

     XXX='F'

      pass



 class B (E)

   XXX='B'

     pass



 class b(E):

       xxx='B'

      pass



 class C(F):

     xxx='C'

    pass



class D(G):

    xxx='D'

   pass



class A(B,C,D):

     xxx='A'

     pass





  print(A.mro())

  在子类派生出的新功能中如何重用父类的功能:

 方式一:指名道姓地访问某一个类中的函数,与继承无关

 方式二:super(Oldboy Teacher,self),在python3中uper可以不传参数,调用该函数会得到一个特殊对象,该对象是专门用来访问父类中属性,、

调用:super 会严格参照类的mro列表依次查找属性

 class OldboyTeacer(Oldboypeople):

    tae,'egon',18'male',10,3000

  def _init_(self,name,age,gender)

    Oldboypeople._init_(self,name,)

        super(OldboyTeacher,self)._init_(name,age,gender)



    self.leve=level

   self.salary=salary



  def score(self,stu,num);

     stu.num=num

      print(‘老师%给学生%s’%(self.name.stu,name,num))



 tea=OldboyTeacher('egon',18,'male',10,3000)#_init__

(tea,'egon',18',male',103000)

 print(tea._dict_)

 print(stu.school)

 

 A没有继承B,

class A:

     def test(self):

         print('A.test')

         super().test()

class B:

   def test(self):

       print('from B')

class C(A,B):

         pass

 

c=C()

c.test()

print(C.mro())

 
原文地址:https://www.cnblogs.com/hui2002/p/9838697.html