J'enseigne une classe python sur la programmation orientée objet et pendant que j'examine la façon d'expliquer les classes, j'ai vu une définition de classe vide:
class Employee:
pass
l'exemple continue ensuite pour définir un nom et d'autres attributs pour un objet de cette classe:
john = Employee()
john.full_name = "john doe"
intéressant!
Je me demande s'il existe un moyen de définir dynamiquement une fonction pour une instance d'une classe comme celle-ci? quelque chose comme:
john.greet() = print 'hello world!'
cela ne fonctionne pas dans mon python interprète mais y a-t-il une autre façon de le faire?
Une classe est plus ou moins un wrapper fantaisie pour un dict
d'attributs aux objets. Lorsque vous instanciez une classe, vous pouvez l'attribuer à ses attributs, et ceux-ci seront stockés dans foo.__dict__
; de même, vous pouvez regarder dans foo.__dict__
pour tous les attributs que vous avez déjà écrits.
Cela signifie que vous pouvez faire des choses dynamiques comme:
class Employee: pass
def foo(self): pass
Employee.foo = foo
ainsi que l'attribution à une instance particulière. (EDIT: paramètre self
ajouté)
Essayez avec lambda
:
john.greet = lambda : print( 'hello world!' )
Vous pourrez faire:
john.greet()
MODIFIER : Merci Thomas K pour la note - cela fonctionne sur Python 3.2
et pas pour Python2, où print
semblait être statement
. Mais cela fonctionnera pour lambda
s, sans instructions (non? Désolé, je ne connais que python3.2
(:)
Vous pouvez également utiliser des "tuples nommés" du module standard collection
. Les tuples nommés fonctionnent comme des tuples "ordinaires" mais les éléments ont des noms et vous pouvez accéder aux éléments en utilisant la "syntaxe à points". De la collection docs :
>>> # Basic example
>>> Point = namedtuple('Point', ['x', 'y'])
>>> p = Point(11, y=22) # instantiate with positional or keyword arguments
>>> p[0] + p[1] # indexable like the plain Tuple (11, 22)
33
>>> x, y = p # unpack like a regular Tuple
>>> x, y
(11, 22)
>>> p.x + p.y # fields also accessible by name
33
>>> p # readable __repr__ with a name=value style
Point(x=11, y=22)
Vous pouvez utiliser AttrDict
>>> from attrdict import AttrDict
>>> my_object = AttrDict()
>>> my_object.my_attribute = 'blah'
>>> print my_object.my_attribute
blah
>>>
Installez attrdict depuis PyPI:
pip install attrdict
Il est également utile dans d'autres situations - comme lorsque vous avez besoin d'un accès aux attributs pour les touches dict.