319 votes

bonne façon de définir les variables de classe en Python

Double Possible:
Les Variables à l'intérieur et à l'extérieur d'une classe init() de la fonction

J'ai été en utilisant des différents code en Python, et remarqué que les gens initialise les attributs de classe de deux façons différentes:

Le premier, comme ceci:

class MyClass:
  __element1 = 123
  __element2 = "this is Africa"

  def __init__(self):
    #pass or something else

Et de l'autre le style ressemble à:

class MyClass:
  def __init__(self):
    self.__element1 = 123
    self.__element2 = "this is Africa"

Que voulez-vous dire, c'est la bonne façon de l'utiliser?

682voto

juliomalegria Points 6281

Les deux voies ne sont pas correctes ou incorrectes, ils sont tout deux différents types d'éléments de classe:

  • Les éléments à l'extérieur de l' __init__ méthode sont les éléments statiques, cela signifie, qu'ils appartiennent à la classe.
  • Les éléments à l'intérieur de l' __init__ méthode, sont des éléments de l'objet (self), ils n'appartiennent pas à la classe.

Vous allez y voir plus clair avec un peu de code:

class MyClass:
    static_elem = 123

    def __init__(self):
        self.object_elem = 456

c1 = MyClass()
c2 = MyClass()

# Initial values of both elements
>>> print c1.static_elem, c1.object_elem 
123 456
>>> print c2.static_elem, c2.object_elem
123 456

# Nothing new so far ...

# Let's try changing the static element
MyClass.static_elem = 999

>>> print c1.static_elem, c1.object_elem
999 456
>>> print c2.static_elem, c2.object_elem
999 456

# Now, let's try changing the object element
c1.object_elem = 888

>>> print c1.static_elem, c1.object_elem
999 888
>>> print c2.static_elem, c2.object_elem
999 456

Comme vous pouvez le voir, nous avons changé de la classe de l'élément, il a changé pour les deux objets. Mais, lorsque nous avons changé l'élément object, l'autre objet est resté inchangé.

21voto

James Polley Points 4258

Je pense que cet exemple explique la différence entre les styles:

 james@bodacious-wired:~$cat test.py 
#!/usr/bin/env python

class MyClass:
    element1 = "Hello"

    def __init__(self):
        self.element2 = "World"

obj = MyClass()

print dir(MyClass)
print "--"
print dir(obj)
print "--"
print obj.element1 
print obj.element2
print MyClass.element1 + " " + MyClass.element2
james@bodacious-wired:~$./test.py 
['__doc__', '__init__', '__module__', 'element1']
--
['__doc__', '__init__', '__module__', 'element1', 'element2']
--
Hello World
Hello
Traceback (most recent call last):
  File "./test.py", line 17, in <module>
    print MyClass.element2
AttributeError: class MyClass has no attribute 'element2'
 

element1 est lié à la classe, element2 est lié à une instance de la classe.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X