Par exemple, ce code est Python:
class c(object): pass a = c() a.b = 3
5 Réponses :
Cela se produit parce que lorsque vous dites a.b = 3 code>, il crée une variable dans A représente b. Par exemple,
class a: pass
a.b = 3
print a.b
Cela ne répond pas pourquoi il peut faire a.b = 3 code> dans le deuxième cas mais pas dans le premier.
Je ne l'ai pas et je ne le ferais pas, mais je dois dire que cela ne répond pas exactement à la question.
Python vous permet généralement de définir n'importe quel attribut sur n'importe quel objet. Ceci est un cas particulier où la classe code> objet code> est différemment. Il existe également des modules mis en œuvre dans C qui agissent de la même manière. P>
Si vous veux em> votre objet se comporter comme ceci, vous pouvez définir un __ setattr __ (auto, nom, valeur) code> méthode qui fait explicitement un
soulever AttributeError ( ) code> Si vous essayez de définir un membre qui ne figure pas sur la "liste approuvée" (voir http://aspn.activestate.com/aspn/cookbook/python/recpe/389916 ) p>
Vous pouvez remplacer le comportement de la méthode magique code> SETATTR __ code> SEL.
class C(object): def __setattr__(self, name, value): allowed_attrs = ('a', 'b', 'c') if name not in allowed_attrs: # raise exception # or do something else pass self.__dict__[name] = value
Création d'un objet code>
instance n'a pas de fonctionnalités . Par conséquent, définir des attributs sur une instance d'un type code> objet code> est expressément désactivé. Vous devez la sous-classer pour pouvoir créer des attributs.
Astuce: Si vous souhaitez qu'un objet simple d'utiliser comme quelque chose sur lequel stocker des propriétés, vous pouvez le faire en créant une fonction anonyme avec lambda code> . Fonctions, être des objets, sont également capables de stocker des attributs, il est donc parfaitement légitime: p>
L'objet code> code> est une classe intégrée écrite en C et ne vous permet pas d'ajouter des attributs. Il a été expressément codé pour l'empêcher.
Le moyen le plus simple d'obtenir le même comportement dans vos propres classes est d'utiliser l'attribut __ __ code> pour définir une liste des attributs exacts que vous souhaitez prendre en charge. Python réservera de la place pour juste ces attributs et ne permettra pas d'autres. P>
class c(object):
__slots__ = "foo", "bar", "baz"
a = c()
a.foo = 3 # works
a.b = 3 # AttributeError
C'est génial, je ne savais pas sur __ Slots __ Code>
Approche intéressante! Je n'étais pas au courant de __ Slots __ code>. Cependant, j'allais sur les mises en garde à cette approche et jeté sur Stackoverflow.com/questions/472000/python-slots . Un bon avertissement est mentionné dans ce fil. Surtout le manque de méthode
__ dict __ code> si nous utilisons
__ Slots __ code>!
Oui, ce sont de bonnes mises en garde. Une manière plus pythonique serait sans doute d'écrire votre propre __ setattr __ () code> pour interdire les attributs non approuvés. Bien sûr, en utilisant
__ slots __ code> va sauvegarder la mémoire et être plus rapide.
Édité pour appeler les pièges.
Comment faire mes classes n'a que des propriétés définies? Code> - Il convient de souligner qu'il s'agit simplement de beaucoup de travail supplémentaire pour une bonne raison et peut-être de briser un peu de métaprogrammation utile, de sorte qu'il devrait donc Soyez évité à moins d'avoir de bonnes raisons de le faire et de savoir exactement ce que vous faites.