Bien que la réponse acceptée soit parfaite, je voudrais ajouter une petite description.
Faisons un petit exercice
tout d'abord définir une classe comme suit:
class A:
temp = 'Skyharbor'
def __init__(self, x):
self.x = x
def change(self, y):
self.temp = y
Alors qu'avons-nous ici?
- Nous avons une classe très simple qui a un attribut
temp
qui est une chaîne
- Une
__init__
méthode qui définitself.x
- Une méthode de changement définit
self.temp
Assez simple jusqu'à présent, oui? Maintenant, commençons à jouer avec cette classe. Initialisons d'abord cette classe:
a = A('Tesseract')
Maintenant, procédez comme suit:
>>> print(a.temp)
Skyharbor
>>> print(A.temp)
Skyharbor
Eh bien, a a.temp
fonctionné comme prévu, mais comment diable a-t-il A.temp
fonctionné? Eh bien, cela a fonctionné parce que temp est un attribut de classe. Tout en python est un objet. Ici A est aussi un objet de classe type
. Ainsi, l'attribut temp est un attribut détenu par la A
classe et si vous modifiez la valeur de temp via A
(et non via une instance de a
), la valeur modifiée sera reflétée dans toute l'instance de A
classe. Allons-y et faisons cela:
>>> A.temp = 'Monuments'
>>> print(A.temp)
Monuments
>>> print(a.temp)
Monuments
Intéressant n'est-ce pas? Et notez que id(a.temp)
et id(A.temp)
sont toujours les mêmes .
Tout objet Python reçoit automatiquement un __dict__
attribut, qui contient sa liste d'attributs. Examinons ce que contient ce dictionnaire pour nos exemples d'objets:
>>> print(A.__dict__)
{
'change': <function change at 0x7f5e26fee6e0>,
'__module__': '__main__',
'__init__': <function __init__ at 0x7f5e26fee668>,
'temp': 'Monuments',
'__doc__': None
}
>>> print(a.__dict__)
{x: 'Tesseract'}
Notez que l' temp
attribut est répertorié parmi A
les attributs de la classe tandis qu'il x
est répertorié pour l'instance.
Alors, comment se fait-il que nous obtenions une valeur définie a.temp
si elle n'est même pas répertoriée pour l'instance a
. Eh bien, c'est la magie de la __getattribute__()
méthode. En Python, la syntaxe pointillée appelle automatiquement cette méthode, donc lorsque nous écrivons a.temp
, Python s'exécute a.__getattribute__('temp')
. Cette méthode exécute l'action de recherche d'attribut, c'est-à-dire trouve la valeur de l'attribut en regardant à différents endroits.
L'implémentation standard de __getattribute__()
recherche d'abord le dictionnaire interne ( dict ) d'un objet, puis le type de l'objet lui-même. Dans ce cas a.__getattribute__('temp')
s'exécute d'abord a.__dict__['temp']
, puisa.__class__.__dict__['temp']
Bon maintenant, utilisons notre change
méthode:
>>> a.change('Intervals')
>>> print(a.temp)
Intervals
>>> print(A.temp)
Monuments
Eh bien maintenant que nous l'avons utilisé self
, print(a.temp)
nous donne une valeur différente de print(A.temp)
.
Maintenant, si nous comparons id(a.temp)
et id(A.temp)
, ils seront différents.
list
comme nom d'attribut.list
est une fonction intégrée pour construire une nouvelle liste. Vous devez écrire les classes de noms avec une majuscule.