Comme écrit avant l'utilisation obj.__dict__
peut gérer les cas les plus courants, mais certaines classes n'ont pas les caractéristiques de la __dict__
et utiliser l'attribut __slots__
(principalement pour des raisons d'efficacité de la mémoire).
pour une manière plus souple de procéder :
class A(object):
__slots__ = ('x', 'y', )
def __init__(self, x, y):
self.x = x
self.y = y
class B(object):
def __init__(self, x, y):
self.x = x
self.y = y
def get_object_attrs(obj):
try:
return obj.__dict__
except AttributeError:
return {attr: getattr(obj, attr) for attr in obj.__slots__}
a = A(1,2)
b = B(1,2)
assert not hasattr(a, '__dict__')
print(get_object_attrs(a))
print(get_object_attrs(b))
la sortie de ce code :
{'x': 1, 'y': 2}
{'x': 1, 'y': 2}
Note1 :
Python est un langage dynamique et il est toujours préférable de connaître les classes dont vous essayez d'obtenir les attributs, car même ce code peut manquer dans certains cas.
Note2 :
ce code ne produit que des variables d'instance, ce qui signifie que les variables de classe ne sont pas fournies, par exemple :
class A(object):
url = 'http://stackoverflow.com'
def __init__(self, path):
self.path = path
print(A('/questions').__dict__)
les sorties de code :
{'path': '/questions'}
Ce code n'imprime pas le url
et peut omettre les attributs de classe souhaités.
Parfois, nous pouvons penser qu'un attribut est un membre de l'instance, mais ce n'est pas le cas et nous ne le verrons pas dans cet exemple.
93 votes
Pratiquement tous les utilisateurs de Python nomment leurs classes de la manière suivante
NewClass
. Vous pouvez défier les attentes des gens en utilisant une convention de dénomination telle quenew_class
.1 votes
Même s'il est interactif et ne peut pas être utilisé par des programmes,
help()
des aides fonctionnelles pour obtenir des informations sur les classes, les fonctions, les composants, les modules, etc.2 votes
Pertinent : stackoverflow.com/questions/1398022/