Comment utiliser __setattr__ correctement, éviter une récursion infinie
Je veux définir une classe contenant read
et write
methode, qui peut être appelé comme suit:
instance.read
instance.write
instance.device.read
instance.device.write
De ne pas utiliser entrelacé classes, mon idée était de remplacer le __getattr__
et __setattr__
méthodes et de vérifier si le nom donné est device
pour rediriger le retour à self
. Mais j'ai rencontré un problème en donnant un récurrences. L'exemple de code est comme suit:
class MyTest(object):
def __init__(self, x):
self.x = x
def __setattr__(self, name, value):
if name=="device":
print "device test"
else:
setattr(self, name, value)
test = MyTest(1)
Comme dans __init__
le code essayé de créer un nouvel attribut x
, il appelle __setattr__
, qui appelle de nouveau __setattr__
et ainsi de suite. Comment dois-je changer ce code, qui, dans ce cas, un nouvel attribut x
de self
est créé, le maintien de la valeur 1
?
Ou est-il une meilleure façon de gérer les appels comme instance.device.read
être 'lié' à instance.read
?
Il y a toujours des questions sur le pourquoi: j'ai besoin de créer des abstractions de xmlrpc
appels, pour lesquels très facile de méthodes comme le myxmlrpc.instance,device.read
et similaires peuvent être créés. J'ai besoin de "se moquer de" ce jusqu'à mimer ces multi-dot-appels de méthode.
- ce cas d'utilisation serait plus facilement résolu en utilisant @property
Vous devez vous connecter pour publier un commentaire.
Vous devez appeler la classe parent
__setattr__
méthode:Concernant les meilleures pratiques, puisque vous prévoyez d'utiliser ce par le biais d'
xml-rpc
je pense que c'est probablement mieux le faire à l'intérieur de la_dispatch
méthode.Une façon rapide et sale est de tout simplement faire:
Ou vous pouvez modifier
self.__dict__
de l'intérieur__setattr__()
:setattr(self, "__dict__", value)
, répétant à l'origine d'une récursion infinie problème?__dict__
attribut, de l'intestin de l'obtenir et de définir ensuite un article sur le retour de l'dict, c'est à dire, il appelle qqch comme:getattr(self, "__dict__").__setitem__(name, value)
Vous pouvez également utiliser objet.
ou vous pouvez simplement utiliser @property: