1. 程式人生 > 其它 >python面向物件的組合和多型、多型性

python面向物件的組合和多型、多型性

組合

組合:一個物件擁有一個屬性,該屬性是另外一個物件

解決類與類之間的冗餘問題:
  1. 繼承: 滿足什麼是什麼的關係
  2. 組合: 滿足什麼有什麼的關係

    比如bar中有n,但我Foo想調n,這是就用到了組合,obj2賦值給obj1.z,然後obj1就可以呼叫n
      class Foo:
          x = 1
          def __init__(self, m):
              self.m = m

          def func1(self):
              return self.m

      class Bar():
          y = 2
          def __init__(self, n):
              self.n = n

          def func2(self):
              return  self.n

      obj1 = Foo(10)
      obj2 = Bar(20)
      obj1.z = obj2
      print(obj1.z.n)

多型與多型性

多型:一種事物的多種狀態
1.水:固定水,液態水,水蒸氣
2.動物:人, 狗, 豬

繼承:解決冗餘問題
  多型類中繼承:不是讓子類遺傳父類的屬性和方法,  是用來給子類定製標準的
  多型帶來的特性:在不用考慮物件資料型別的情況下,直接呼叫物件的方法

     制定子類的標準
          import abc  # abstract => 抽象
        # 該類已經為抽象類了,是用來給子類定製標準的
        class Animal(metaclass=abc.ABCMeta):
            @abc.abstractmethod
            def speak(self):
                pass

            @abc.abstractmethod    #修飾符
            def run(self):
                pass

        class People(Animal):
            def speak(self):
                pass

        class Dog(Animal):
            def speak(self):
                pass


        class Pig(Animal):
            def speak(self):
                pass
            pass

        obj1 = People()
        obj2 = Dog()
        obj3 = Pig()

        obj1.speak()
        obj2.speak()
        obj3.speak()
     約定熟成的:也就是鴨子型別
       Python崇尚鴨子型別,即‘如果看起來像、叫聲像而且走起路來像鴨子,那麼它就是鴨子’
         python程式設計師通常根據這種行為來編寫程式。例如,如果想編寫現有物件的自定義版本,可以繼承該物件
           也可以建立一個外觀和行為像,但與它無任何關係的全新物件,後者通常用於儲存程式元件的鬆耦合度。
        class People():
            def speak(self):
                pass

        class Dog():
            def speak(self):
                pass

        class Pig():
            def speak(self):
                pass
         
        obj1 = People()
        obj2 = Dog()
        obj3 = Pig()

        obj1.speak()
        obj2.speak()
        obj3.speak()