1. 程式人生 > >類的繼承和多態

類的繼承和多態

ldb pri 我們 3.1 b- 方式 bar per 依賴

繼承

1、什麽是繼承?

繼承是一種新建類的方式

新建的類稱之為類或者派生類,

父類又可以稱之為基類或者超類

子類會‘遺傳’父類的屬性

繼承是類與類之間的關系,尋找這種關系需要先抽象再繼承

2、為什麽要用繼承

減少代碼冗余

3、怎麽用繼承

class parentclass1:
    pass
class parentclass2:
    pass
class subclass1(parentclass1):
    pass
class subclass2(parentclass1,parentclass2):#這就是繼承上面
    pass


print(subclass2.__bases__)#這個bases就是查看有幾個‘爹’的

那我們能從“爹”那裏能繼承什麽呢?

class parent1:
    school=‘oldboy’
    def __init__(self, name,age,sex):
        self.name=name
        self.age=age
        self.sex=sex
class parent2:
  school=‘oldboy‘
  def __init__(self,name,age,sex):
    self.name=name
    self.age=age
    self.sex=sex
class son1(parent1):
def f1(self): print(%s son1%self.name) class son2(parent1,parent2): def f2(self): print(%s son2%self.name)

猜一猜 f2中的f1,調用的到底是哪裏的?是自己的還是兒子的

調用的是兒子輩的。不是根據就近原則找自己的而是找兒子的

class foo():          #
    def f1(self):
        print(fool.f1)
    def f2(self):
        print(foo.f2
) self.f1() class bar(foo): #兒子 def f1(self): print(bar.f1)

派生:子類定義自己新的屬性,如果與父輩同名,以子類自己為準

class OldboyPeople:
#     school = ‘oldboy‘
#
#     def __init__(self, name, age, sex):
#         self.name = name
#         self.age = age
#         self.sex = sex
#
#     def f1(self):
#         print(‘爹的f1‘)
class OldboyTeacher(OldboyPeople): # def change_score(self): # print(‘teacher %s is changing score‘ %self.name) # # def f1(self): # print(‘兒子的f1‘) # # tea1 = OldboyTeacher(‘egon‘, 18, ‘male‘) # tea1.f1(class OldboyPeople:
    school = oldboy

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

    def f1(self):
        print(爹的f1)

class OldboyTeacher(OldboyPeople):
    def __init__(self,name,age,sex,level,salary):#應用自己的,不用父輩了
self.name
=name self.age=age self.sex=sex self.level=level self.salary=salary def change_score(self): print(teacher %s is changing score %self.name) def f1(self): print(兒子的f1) tea1 = OldboyTeacher(egon, 18, male,9,3.1) print(tea1.name,tea1.age,tea1.sex,tea1.level,tea1.salary)

子類派生出的新方法中重用父輩的功能:

方法一:指名道姓地調用(其實與繼承沒有什麽關系的)

OldboyPeople.__init__(self,name, age, sex)

# class OldboyPeople:
#     school = ‘oldboy‘
#
#     def __init__(self, name, age, sex):
#         self.name = name
#         self.age = age
#         self.sex = sex
#
#     def tell_info(self):
#         print("""
#         ===========個人信息==========
#         姓名:%s
#         年齡:%s
#         性別:%s
#         """ %(self.name,self.age,self.sex))
#
#
# class OldboyTeacher(OldboyPeople):
#     #            tea1,‘egon‘, 18, ‘male‘, 9, 3.1
#     def __init__(self, name, age, sex, level, salary):
#         # self.name = name
#         # self.age = age
#         # self.sex = sex
#         OldboyPeople.__init__(self,name, age, sex)#指名道姓的應用
#
#         self.level = level
#         self.salary = salary
#
#     def tell_info(self):
#         OldboyPeople.tell_info(self)
#         print("""
#         等級:%s
#         薪資:%s
#         """ %(self.level,self.salary))
#
# tea1 = OldboyTeacher(‘egon‘, 18, ‘male‘, 9, 3.1)
# # print(tea1.name, tea1.age, tea1.sex, tea1.level, tea1.salary)
#
#
# tea1.tell_info()

方法二:super()調用(嚴格依賴於繼承)

super()的返回值是一個特殊的對象,該對象專門用來調用父類中的屬性

#了解再python2中,需要super(自己的類名,self)

class OldboyPeople:
    school = oldboy

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

    def tell_info(self):
        print("""
        ===========個人信息==========
        姓名:%s
        年齡:%s
        性別:%s
        """ %(self.name,self.age,self.sex))


class OldboyTeacher(OldboyPeople):
    #            tea1,‘egon‘, 18, ‘male‘, 9, 3.1
    def __init__(self, name, age, sex, level, salary):
        # OldboyPeople.__init__(self,name, age, sex)
        super(OldboyTeacher,self).__init__(name,age,sex)

        self.level = level
        self.salary = salary

    def tell_info(self):
        # OldboyPeople.tell_info(self)
        super().tell_info()
        print("""
        等級:%s
        薪資:%s
        """ %(self.level,self.salary))

tea1 = OldboyTeacher(egon, 18, male, 9, 3.1)
# print(tea1.name, tea1.age, tea1.sex, tea1.level, tea1.salary)
tea1.tell_info()

二、經典類與新式類

1、新式類:

  繼承object的類,以及該類的子類,都是新式類,在python3中,如果一個類沒有指定繼承父輩,默認就繼承object

所以說python3中所有的類都是新式類

技術分享圖片

2、經典類:

  沒有繼承object的類,以及該類的子類,都是經典類

技術分享圖片

三、在棱形繼承背景下,super嚴格按照查找屬性

1、經典類:深度優先

先f--》d--》b--》a 找到了就不找了。一條道路走到黑

2、新式類:廣度優先

先f--》d--》b--》e--》c--》a 按照菱形找

class A:
    # def test(self):
    #     print(‘from A‘)
    pass

class B(A):
    # def test(self):
    #     print(‘from B‘)
    pass

class C(A):
    # def test(self):
    #     print(‘from C‘)
    pass
class D(B):
    # def test(self):
    #     print(‘from D‘)
    pass

class E(C):
    # def test(self):
    #     print(‘from E‘)
    pass

class F(D,E):
    # def test(self):
    #     print(‘from F‘)
    pass
# f1=F()
# f1.test()

# F->D->B->E->C-A->object

print(F.mro())

類的繼承和多態