Double Possible:
Les Variables à l'intérieur et à l'extérieur d'une classe init() de la fonctionJ'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?
Réponses
Trop de publicités?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é.
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.