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
tempqui 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.tempfonctionné comme prévu, mais comment diable a-t-il A.tempfonctionné? 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 Aclasse 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 Aclasse. 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' tempattribut est répertorié parmi Ales attributs de la classe tandis qu'il xest répertorié pour l'instance.
Alors, comment se fait-il que nous obtenions une valeur définie a.tempsi 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 changemé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.
listcomme nom d'attribut.listest une fonction intégrée pour construire une nouvelle liste. Vous devez écrire les classes de noms avec une majuscule.