Peut-être que je suis fou mais cela semble très facile en effet - la chose est de faire votre classe interne à l'intérieur d'une méthode de la classe externe ...
def do_sthg(self):
...
def mess_around(self):
outer_class_self = self
class Mooble():
def do_sthg_different(self):
...
outer_class_self.do_sthg()
De plus... "self" n'est utilisé que par convention, donc vous pourriez faire ça :
def do_sthg(self):
...
def mess_around(outer_class_self):
class Mooble():
def do_sthg_different(self):
...
outer_class_self.do_sthg()
On pourrait objecter que l'on ne peut pas créer cette classe interne à partir de la classe externe... mais ce n'est pas vrai :
class Bumblebee():
def do_sthg(self):
print "sthg"
def give_me_an_inner_class(outer_class_self):
class Mooble():
def do_sthg_different(self):
print "something diff\n"
outer_class_self.do_sthg()
return Mooble
puis, quelque part à des kilomètres de là :
blob = Bumblebee().give_me_an_inner_class()()
blob.do_sthg_different()
même pousser le bateau un peu plus loin et étendre cette classe interne (NB pour obtenir super()
pour fonctionner, vous devez changer la signature de la classe de Mooble
à class Mooble(object)
).
class InnerBumblebeeWithAddedBounce(Bumblebee().give_me_an_inner_class()):
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()
plus tard
mrh1997 a soulevé un point intéressant au sujet de l'héritage non commun des classes internes livrées en utilisant cette technique. Mais il semble que la solution soit assez simple :
class Fatty():
def do_sthg(self):
pass
class InnerFatty(object):
pass
def give_me_an_inner_fatty_class(self):
class ExtendedInnerFatty(Fatty.InnerFatty):
pass
return ExtendedInnerFatty
fatty1 = Fatty()
fatty2 = Fatty()
innerFattyClass1 = fatty1.give_me_an_inner_fatty_class()
innerFattyClass2 = fatty2.give_me_an_inner_fatty_class()
print (issubclass(innerFattyClass1, Fatty.InnerFatty))
print (issubclass(innerFattyClass2, Fatty.InnerFatty))
0 votes
Pourquoi faites-vous cela ? Qu'est-ce qui ne va pas avec de simples relations entre pairs ? Essayez-vous de "dissimuler" quelque chose ?
4 votes
Un exemple de ce scénario pourrait être une classe avec des sous-classes qui doivent accéder à la classe externe, comme d'habitude, mais il faut ensuite créer une autre classe (de premier niveau) dérivée de la première classe. Dans ce cas, les sous-classes de la deuxième classe essaieraient d'accéder au parent en utilisant la méthode suivante
self.<original_parent_name>
y obtenir la classe originale, pas la nouvelle classe dont ils sont une sous-classe . J'espère que les personnes qui liront ces lignes pourront visualiser ce scénario difficile et comprendre l'intérêt de questions comme celle-ci.1 votes
Dupliquer à stackoverflow.com/questions/2278426 et il a une belle réponse.