たぶん私は怒っているかもしれませんが、これは確かに非常に簡単に思えます-問題は、内部クラスを外部クラスのメソッド内に作成することです...
def do_sthg(self):
...
def messAround(self):
outerClassSelf = self
class Mooble():
def do_sthg_different(self):
...
outerClassSelf.do_sthg()
さらに...「self」は慣例でのみ使用されるため、次のようにすることができます。
def do_sthg(self):
...
def messAround(outerClassSelf):
class Mooble():
def do_sthg_different(self):
...
outerClassSelf.do_sthg()
外部クラスの外部からこの内部クラスを作成することはできないと反対されるかもしれません...しかし、これは真実ではありません:
class Bumblebee():
def do_sthg(self):
print "sthg"
def giveMeAnInnerClass(outerClassSelf):
class Mooble():
def do_sthg_different(self):
print "something diff\n"
outerClassSelf.do_sthg()
return Mooble
それから、何マイルも離れたどこかで:
blob = Bumblebee().giveMeAnInnerClass()()
blob.do_sthg_different()
ボートを少し押し出して、この内部クラスを拡張することもできます (作業を開始するには、 のクラス シグネチャをにsuper()
変更する必要があります)。Mooble
class Mooble(object)
class InnerBumblebeeWithAddedBounce(Bumblebee().giveMeAnInnerClass()):
def bounce(self):
print "bounce"
def do_sthg_different(self):
super(InnerBumblebeeWithAddedBounce, self).do_sthg_different()
print "and more different"
ibwab = InnerBumblebeeWithAddedBounce()
ibwab.bounce()
ibwab.do_sthg_different()
後で
mrh1997 は、この手法を使用して提供される内部クラスの非一般的な継承について興味深い点を提起しました。しかし、解決策は非常に簡単なようです。
class Fatty():
def do_sthg(self):
pass
class InnerFatty(object):
pass
def giveMeAnInnerFattyClass(self):
class ExtendedInnerFatty(Fatty.InnerFatty):
pass
return ExtendedInnerFatty
fatty1 = Fatty()
fatty2 = Fatty()
innerFattyClass1 = fatty1.giveMeAnInnerFattyClass()
innerFattyClass2 = fatty2.giveMeAnInnerFattyClass()
print (issubclass(innerFattyClass1, Fatty.InnerFatty))
print (issubclass(innerFattyClass2, Fatty.InnerFatty))