オブジェクト向けのマルチ継承
3737 ワード
マルチ継承 Pythonの異なるバージョンのクラス マルチ継承 マルチ継承のメリットとデメリット Pythonマルチ継承 を実現
構文:
classクラス名(ベースクラスリスト):
ステートメントブロック
需要:Documentサブクラスに印刷機能を提供する
考え方:
1ベースクラスでprintメソッドを提供する
サブクラスが提供する方法は、必ずしもサブクラスの印刷に適していないため、サブクラスではオーバーライド重量が必要であるため、具体的に実現すべきではない.
書き込み、printは印刷能力であり、すべてのDocumentサブクラスが必要とするわけではない.
2印刷機能が必要なサブクラスに追加
サブクラスに直接追加すると、OCPの原則に違反するので、継承して追加すべきです Mixinクラス
Python2.2 , object , .
Python2 , ( )
Python3
object , super.
OCP : 、
: 、
, 、 , ,
, . , .
,
:
:
, ,
:
. ?
?
,
C++ ;Java
Java , , .Java ,
, ,
, , , shout ,
shout ?
:
, , ,
構文:
classクラス名(ベースクラスリスト):
ステートメントブロック
Python MRO(method resolusion order)
需要:Documentサブクラスに印刷機能を提供する
考え方:
1ベースクラスでprintメソッドを提供する
サブクラスが提供する方法は、必ずしもサブクラスの印刷に適していないため、サブクラスではオーバーライド重量が必要であるため、具体的に実現すべきではない.
書き込み、printは印刷能力であり、すべてのDocumentサブクラスが必要とするわけではない.
2印刷機能が必要なサブクラスに追加
サブクラスに直接追加すると、OCPの原則に違反するので、継承して追加すべきです
#
class Document:
def printable(self):
print('Document')
class Word(Document):
def printable(self):
print('word')
class Pdf(Document): pass
Word().printable()
Pdf().printable()
#
class PrintableWord(Word):
@classmethod
def print(cls): # print = classmethod(print)
print(id(print))
print('printword')
class Document:
def printable(self):
print('Document')
class Word(Document): pass
class Pdf(Document): pass
PrintableWord().print()
print(PrintableWord.__dict__)
print(PrintableWord.__mro__)
, , , ,
, .
:
1. , , ,
2. Mixin, , , ,
, ,
#
# ,
def printable(cls):
cls.printable = lambda self: print(self.content)
return cls
class Document:
def __init__(self,content):
self.content = content
class Word(Document): pass
class Pdf(Document): pass
@printable
class PrintableWord(Word): pass
PrintableWord('word print').printable()
print(PrintableWord.__dict__)
print(PrintableWord.__mro__)
# Mixin
# 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
PrintableWord('word print').print()
print(PrintableWord.__mro__)
# Mixin, Mixin
class SuperPrintableMixin(PrintableMixin):
def print(self):
print('strengthen')
super().print()
print('strengthen')
class PrintableWord(SuperPrintableMixin,Word): pass
PrintableWord('word print').print()
print(PrintableWord.__mro__)
Mixin
Mixin
, , , ,
.
, 、
Mixin
1 Mixin __init__
2 Mixin ,
3 Mixin Mixin
,Mixin
class PrintableWord(PrintableWord,word):pass
Mixin, , Mixin.