Vous pouvez créer une classe, pour décorer les classes internes. Dans ce cas, @inner.
Puisque c'est un décorateur : Outer.A = inner(Outer.A). Si votre code nécessite Outer.A, il sera exécuté. inner.__get__
qui renvoie la classe originale (A) avec un nouvel attribut défini sur elle : A.owner = Outer.
Une méthode de classe dans la classe A, dans ce cas-ci def add(cls, y=3)
peut utiliser un nouvel attribut owner
à l'adresse return cls.owner.x + y + 1
.
La ligne setattr(owner, name, self.inner)
, casse le descripteur car owner.name => Outer.A => A
n'est plus une instance de la classe inner.
J'espère que cela vous aidera.
class inner:
def __init__(self, inner):
self.inner = inner
def __get__(self, instance, owner):
print('__get__ method executed, only once... ')
name = self.inner.__name__
setattr(self.inner, 'owner', owner)
setattr(owner, name, self.inner) # breaks descriptor
return self.inner #returns Inner
class Outer:
x = 1
@inner
class A:
@classmethod
def add(cls, y=3):
return cls.owner.x + y + 1
print(Outer.A.add(0)) # First time executes inner.__get__ method
print(Outer.A.add(0)) # Second time not necessary.
>> __get__ method executed, only once...
>> 2
>> 2
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.