標籤:學習筆記
繼承
- 基本概念個體繼承自父母,繼承了父母的一部分特徵,但也可以有自己的個性
- 子類繼承了父類,就直接擁有了父類的屬性和方法,也可以定義自己的屬性、方法,甚至對父類的屬性、方法進行重寫
Python繼承實現
類的特殊屬性與方法
- base
- bases
- mro
- mro()
- subclasses()
Python繼承中的注意事項
- 屬於父類的私人成員,子類即使與父類存在繼承關係也不可直接存取(可通過改名後的屬性名稱訪問,但慎用)
- 例子:
class Animal: __count=100 heigtht=0 def showcount3(self): print(self.__count)class Cat(Animal): name=‘cat‘ __count=200c=Cat()c.showcount3()
結果為100
因為子類調用了父類擷取父類私人變數的方法 self.count的count範圍是在父類下的,其真正調用的self._Animal__count,而這個屬性只有父類有
- 解決的辦法:自己私人的屬性,用自己的方法讀取和修改,不要藉助其他類的方法,即使是父類或衍生類別的方法
屬性尋找順序
- 執行個體dict -> 類dict -> 父類dict
多繼承
Mixin
Mixin類使用原則
def printable(cls): def _print(self): print(self.content, ‘decorator‘) cls.print = _print return clsclass Document: def __init__(self, content): self.content = contentclass Word(Document): passclass Pdf(Document): pass@printableclass PrintableWord(Word): passprint(PrintableWord.__dict__)print(PrintableWord.mro())pw = PrintableWord(‘test string‘)pw.print()@printableclass PrintablePdf(Word): pass
Mixin實現
class Document: def __init__(self, content): self.content = contentclass Word(Document): passclass Pdf(Document): passclass PrintableMixin: def print(self): print(self.content, ‘Mixin‘)class PrintableWord(PrintableMixin, Word): passprint(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): passprint(SuperPrintablePdf.__dict__)print(SuperPrintablePdf.mro())spp = SuperPrintablePdf(‘super print pdf‘)spp.print()
Mixin類和裝飾器
- 這兩種方式都可以使用,看個人喜好
- 如果還需要繼承就得使用Mixin類
Python第八周 學習筆記(1)