面向物件的三大特徵和多型性
阿新 • • 發佈:2021-12-06
內容概要
- 面向物件的三大特徵
1.封裝
2.繼承
3.多型 - 繼承的屬性查詢順序
1.單繼承下的屬性查詢
2.多繼承下的屬性查詢 - super()和mro列表
- 多型與多型性
繼承
1.什麼是繼承
繼承就是新建類的一種方式,新建的類我們成為子類或派生類,被繼承的類我們成為父類或基類
子類可以使用父類中的屬性或方法
2.為什麼要用繼承
類解決了物件與物件之間的程式碼冗餘問題
繼承解決了類與類之間的程式碼冗餘問題
3.如何使用繼承
新式類:繼承了object類的子子孫孫類都是新式類
經典類:沒有繼承object類的子子孫孫類都是經典類
新式類和經典類只有在python2中有區分
類的繼承
# 父類 class People(): school = 'zj' def __init__(self, name, age, hobby): self.name = name self.age = age self.hobby = hobby # 學生類(子類) class Student(People): def __init__(self, name, age, hobby, course=None): if course is None: course = [] People.__init__(self, name, age, hobby) self.courses = course def choice_course(self, course): self.courses.append(course) print('學生%s選擇%s課程' % (self.name, self.courses)) stu = Student('aaa', 18, 'music') stu.choice_course('music') # 教師類(子類) class Teacher(People): def __init__(self, name, age, hobby, ): People.__init__(self, name, age, hobby) def score(self, stu1, stu2, score): print('教師%s給%s的%s課程打%s分' % (self.name, stu1, stu2, score)) tea = Teacher('sss', 27, 'run') tea.score('aaa', 'music', 90)
單繼承下屬性查詢
class Animal():
def dog(self):
print('is dog')
def cat(self):
print('is cat')
self.dog()
class Crawl(Animal):
def dog(self):
print('one dog')
obj = Crawl()
obj.cat()
練習 class Animal(): def __dog(self): # _Animal__dog print('is dog') def cat(self): print('is cat') self.__dog() # _Animal__dog class Crawl(Animal): def __dog(self): # _Crawl__dog print('one dog') obj = Crawl() obj.cat()
多繼承下的屬性查詢
新式類:按照廣度優先查詢 經典類:按照深度優先查詢 class A(): def test(self): print('from A') class B(A): def test(self): print('from B') class C(A): def test(self): print('from C') class D(B): def test(self): print('from D') class E(C): def test(self): print('from E') class F(D, E): def test(self): print('from F') obj = F() obj.test()
super()和mro()列表
super()用法
# 父類
class People():
school = 'zj'
def __init__(self, name, age, hobby):
self.name = name
self.age = age
self.hobby = hobby
# 學生類(子類)
class Student(People):
def __init__(self, name, age, hobby, course=None):
if course is None:
course = []
# People.__init__(self, name, age, hobby)
# super(Student, self)返回一個特殊物件
# 他的使用遵循mro列表
super(Student, self).__init__(name, age, hobby)
self.courses = course
def choice_course(self, course):
self.courses.append(course)
print('學生%s選擇%s課程' % (self.name, self.courses))
stu = Student('aaa', 18, 'music')
print(stu.name)
# 教師類(子類)
class Teacher(People):
def __init__(self, name, age, hobby, ):
# People.__init__(self, name, age, hobby)
super().__init__(name, age, hobby)
def score(self, stu1, stu2, score):
print('教師%s給%s的%s課程打%s分' % (self.name, stu1, stu2, score))
tea = Teacher('sss', 27, 'run')
print(tea.age)
mro列表
練習1
class A:
def test(self):
print('from A.test')
super().test()
class B:
def test(self):
print('from B')
class C(A, B):
pass
c = C()
c.test()
print(C.__mro__)
練習2
class A:
def test(self):
print('A---->test')
super().aaa()
class B:
def test(self):
print('B---->test')
def aaa(self):
print('B---->aaa')
class C(A, B):
def aaa(self):
print('C----->aaa')
c = C()
c.test()
print(C.__mro__)
練習3
class A:
def test(self):
print('A---->test')
super().aaa()
class B:
def test(self):
print('B---->test')
def aaa(self):
print('B---->aaa')
class C(A, B):
def aaa(self):
print('C----->aaa')
c = A()
print(A.__mro__)
c.test() # 報錯
多型與多型性
什麼事多型
水:液態水,固態水,氣態水
import abc
# 抽象類: 抽象類只能被繼承,不能被例項化
class Animal(metaclass=abc.ABCMeta):
@abc.abstractmethod # 該方法已經是抽象方法了
def speak(self): pass
@abc.abstractmethod
def login(self): pass
class People(Animal):
def speak(self):
# print('嗷嗷嗷')
pass
def login(self):
pass
class Pig(Animal):
def speak(self):
print('哼哼哼')
class Dog(Animal):
def speak(self):
print('汪汪汪')
obj = People()
obj.speak()
# 多型練習
class Pig():
def speak(self):
print('哼哼哼')
class Dog():
def speak(self):
print('汪汪汪')
class Txt():
def speak(self):
print('Txt')
obj = People()
obj1 = Pig()
obj2 = Dog()
obj3 = Txt()
# 多型帶來的特性:在不用考慮物件資料型別的情況下,直接呼叫對應的函式
def animal(animal):
return animal.speak()
animal(obj)
animal(obj1)
animal(obj2)
animal(obj3)
# 父類限制子類的行為
class Animal():
def speak(self):
raise Exception("必須實現speak方法")