1. 程式人生 > >Python第八周 學習筆記(1)

Python第八周 學習筆記(1)

學習筆記

繼承
  • 基本概念個體繼承自父母,繼承了父母的一部分特征,但也可以有自己的個性
  • 子類繼承了父類,就直接擁有了父類的屬性和方法,也可以定義自己的屬性、方法,甚至對父類的屬性、方法進行重寫

Python繼承實現

  • class Cat(Animal) 括號中為該類的父類列表

  • 如果類定義時沒有父類列表,則只繼承object類
  • object類是所有類的祖先類

類的特殊屬性與方法

  • base
    • 類的基類
  • bases
    • 類的基類的元組
  • mro
    • 方法解析時的類的查找順序,返回元組
  • mro()
    • 作用同上,返回列表
  • subclasses()
    • 返回類的子類的列表

Python繼承中的註意事項

  • 屬於父類的私有成員,子類即使與父類存在繼承關系也不可直接訪問(可通過改名後的屬性名訪問,但慎用)
  • 例子:

class Animal:
    __count=100
    heigtht=0

    def showcount3(self):
        print(self.__count)

class Cat(Animal):
    name=‘cat‘
    __count=200

c=Cat()
c.showcount3()

結果為100

因為子類調用了父類獲取父類私有變量的方法 self.count的count作用域是在父類下的,其真正調用的self._Animal__count,而這個屬性只有父類有

  • 解決的辦法:自己私有的屬性,用自己的方法讀取和修改,不要借助其他類的方法,即使是父類或派生類的方法

屬性查找順序

  • 實例dict -> 類dict -> 父類dict

多繼承

  • 一個類繼承自多個類就是多繼承,他將具有多個類的特征

  • 多繼承容易引起二義性,為此Python3利用C3算法生成MRO有序列表解決多繼承的二義性(拓撲排序)
    https://kevinguo.me/2018/01/19/python-topological-sorting/#%E4%B8%80%E4%BB%80%E4%B9%88%E6%98%AF%E6%8B%93%E6%89%91%E6%8E%92%E5%BA%8F

Mixin

  • 本質是多繼承
  • 體現的是一種組合的設計模式

Mixin類使用原則

  • 類中不應該顯示的出現init初始化方法
  • 通常不能獨立工作,因為它是準備混入別的類中的部分功能實現
    其祖先類也應是Mixin類

  • 使用Mixin時,其通常在繼承列表的第一個位置

  • 裝飾器實現

def printable(cls):
    def _print(self):
        print(self.content, ‘decorator‘)

    cls.print = _print
    return cls

class Document:
    def __init__(self, content):
        self.content = content

class Word(Document):
    pass

class Pdf(Document):
    pass

@printable
class PrintableWord(Word): pass

print(PrintableWord.__dict__)
print(PrintableWord.mro())

pw = PrintableWord(‘test string‘)
pw.print()

@printable
class PrintablePdf(Word):
    pass
  • 優點:
    • 簡單方便,在需要的地方動態增加,直接使用裝飾器

Mixin實現


class Document:
    def __init__(self, content):
        self.content = content

class Word(Document):
    pass

class Pdf(Document):
    pass

class PrintableMixin:
    def print(self):
        print(self.content, ‘Mixin‘)

class PrintableWord(PrintableMixin, Word):
    pass

print(PrintableWord.__dict__)
print(PrintableWord.mro())

pw = PrintableWord(‘test string‘)
pw.print()

class SuperPrintableMixin(PrintableMixin):
    def print(self):
        print(‘~‘ * 20)
        super().print()
        print(‘~‘ * 20)

class SuperPrintablePdf(SuperPrintableMixin, Pdf):
    pass

print(SuperPrintablePdf.__dict__)
print(SuperPrintablePdf.mro())

spp = SuperPrintablePdf(‘super print pdf‘)

spp.print()

Mixin類和裝飾器

  • 這兩種方式都可以使用,看個人喜好
  • 如果還需要繼承就得使用Mixin類

Python第八周 學習筆記(1)