web-dev-qa-db-fra.com

python objet de classe vide

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?

47
Ramy

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é)

35
Katriel

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 lambdas, sans instructions (non? Désolé, je ne connais que python3.2 (:)

16
Kiril Kirov

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)
0
Laryx Decidua

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.

0
Sudheer