1. 程式人生 > 實用技巧 >類的繼承和組合

類的繼承和組合

目錄

  • 類的繼承: 什麼是什麼, 比如人是動物, 所以人就屬於動物類

  • 類的組合: 什麼有什麼, 比如老師有名字, 老師有年齡, 老師有課程, 所以名字, 年齡, 課程這些屬性類就可以組合到老師類

類的組合

class Teacher:
    def __init__(self,name:str,age,sex,level:int,salary):
        self.name=name
        self.age=age
        self.sex=sex
        self.level=level
        self.salary=salary

class Course:
    def __init__(self,course_name,course_price,course_period):
        self.course_name=course_name
        self.course_price=course_price
        self.course_period=course_period

python=Course('python',1000,'1mons')

teacher1=Teacher('ross',18,'male',10,3000)
teacher2=Teacher('joey',28,'male',20,3000)

teacher1.course=python  #不需要改動Teacher類的程式碼就可以直接組合課程屬性到物件teacher1
teacher2.course=python

print(teacher1.course.course_name)

抽象類

抽象類, 如下圖, 每種動物都有行走的方法, 但是定義了不同的方法名字, 很不友好, 如果解決這個問題就可以使用抽象類

class People:
    def walk(self):
        print('people is walking')

class Pig:
    def run(self):
        print('pig is running')

peo1=People()
pig1=Pig()

peo1.walk()
pig1.run()

# people is walking
# pig is running

通過抽象類規範子類的方法, 抽象類只能被規範, 不能被例項化

​ 引入模組abc, 下面的程式碼中父類Animal通過abc模組的abstractmethod的裝飾器裝飾了方法run和eat, 所以在子類People和Pig中必須要有被裝飾的這兩個方法run和eat, 如果子類中沒有這兩個方法, 則會報錯如下

TypeError: Can't instantiate abstract class People with abstract methods eat, run
import abc
class Animal(metaclass=abc.ABCMeta):
    @abc.abstractmethod
    def run(self):
        pass
    @abc.abstractmethod
    def eat(self):
        pass

class People(Animal):
    def run(self):
        print('people is walking')
    def eat(self):
        print('people is eating')

class Pig(Animal):
    def run(self):
        print('pig is running')

    def eat(self):
        print('pig is eating')

peo1=People()
pig1=Pig()

def func(obj):
    obj.run()

func(peo1)
func(pig1)