/ / Une instance de classe créée par une autre instance de classe peut-elle accéder aux membres du créateur? - python, python-2.7

Une instance de classe créée par une autre instance de classe peut-elle accéder aux membres du créateur? - python, python-2.7

J'ai une instance d'une classe Python qui esten créer un autre, et je me demande si la classe "créée" peut accéder aux membres du "créateur" sans les transmettre explicitement, ou faire quelque chose comme ceci:

class Creator(object):
def __init__(self, parameter):
self.parameter = parameter
self.created = Created(self)

class Created(object):
def __init__(self, creator):
self.creator = creator
self.parameter = self.creator.parameter

Je suppose que ce que je suis en train de faire est de permettre parameter accessible aux deux, sauf que dans la pratique, il y aura plusieurs paramètres. Par conséquent, si vous les passez tous, la liste des arguments sera longue. Ma solution actuellement est d’utiliser un Creator comme argument à un Created. Existe-t-il un moyen moins maladroit ou plus intelligent de procéder? Peut-être mettre tous les paramètres dans un dictionnaire?

Réponses:

3 pour la réponse № 1

Vous pouvez le faire et vous l’avez presque fait, avec un problème mineur:

class Created():
def __init__(self, creator):
self.parameter = self.creator.parameter

Il n'y a pas self.creator. Si vous n'avez jamais besoin d'y accéder à nouveau après cela __init__ appelez, utilisez le creator paramètre directement:

class Created():
def __init__(self, creator):
self.parameter = creator.parameter

Si vous en avez besoin plus tard, stockez-le comme self.creator, et bien sûr vous pouvez y accéder ici:

class Created():
def __init__(self, creator):
self.creator = creator
self.parameter = self.creator.parameter

… Bien que vous n’ayez probablement même pas besoin de copier parameter dans ce cas, parce que vous pouvez toujours y arriver comme self.creator.parameter.

Ceci est un modèle très commun.

Le seul inconvénient est que si vous conservez la référence arrière (self.creator = creator), vous ne pouvez pas __del__ méthodes. (Ou vous devez en faire un weakref, ou une référence indirecte, comme une clé pouvant être utilisée pour rechercher le créateur selon les besoins.)


0 pour la réponse № 2

Une autre option

class Creator():
def __init__(self, parameter):
self.parameter = parameter
self.created = Created()
self.created.creator = self

0 pour la réponse № 3

IMHO ça a l'air bien. Si paramètre est un attribut de classe au lieu d’une instance, vous pouvez utiliser l’héritage, mais je ne pense pas que c’est une telle amélioration.

def creator_factory(param):
class Creator(object):
parameter = param
return Creator

Creator = creator_factory(something)

class Created(Creator):
pass

>>> Created().parameter
"something"