11
votes

Peut définir n'importe quelle propriété d'objet Python

Par exemple, ce code est Python:

class c(object): pass
a = c()
a.b = 3


1 commentaires

Comment faire mes classes n'a que des propriétés définies? - 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.


5 Réponses :


-1
votes

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


2 commentaires

Cela ne répond pas pourquoi il peut faire a.b = 3 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.



2
votes

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 objet est différemment. Il existe également des modules mis en œuvre dans C qui agissent de la même manière.

Si vous veux votre objet se comporter comme ceci, vous pouvez définir un __ setattr __ (auto, nom, valeur) méthode qui fait explicitement un soulever AttributeError ( ) 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 )


0 commentaires

3
votes

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


0 commentaires

1
votes

Création d'un objet instance n'a pas de fonctionnalités . Par conséquent, définir des attributs sur une instance d'un type objet 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 . Fonctions, être des objets, sont également capables de stocker des attributs, il est donc parfaitement légitime: xxx


0 commentaires

12
votes

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


4 commentaires

C'est génial, je ne savais pas sur __ Slots __


Approche intéressante! Je n'étais pas au courant de __ Slots __ . 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 __ si nous utilisons __ Slots __ !


Oui, ce sont de bonnes mises en garde. Une manière plus pythonique serait sans doute d'écrire votre propre __ setattr __ () pour interdire les attributs non approuvés. Bien sûr, en utilisant __ slots __ va sauvegarder la mémoire et être plus rapide.


Édité pour appeler les pièges.