261 votes

Différence entre les variables à l'intérieur et à l'extérieur de __init__() (attributs de classe et d'instance)

Y a-t-il une différence entre ces classes autre que le nom?

class WithClass ():
    def __init__(self):
        self.value = "Bob"
    def my_func(self):
        print(self.value)

class WithoutClass ():
    value = "Bob"

    def my_func(self):
        print(self.value)

Est-ce que cela fait une différence si j'utilise ou non la méthode __init__ pour déclarer la variable value?

Mon principal souci est que je l'utiliserai d'une certaine manière, ce qui pourrait me causer des problèmes par la suite.

1 votes

Une réponse détaillée avec des exemples dans la question dupliquée : stackoverflow.com/a/9056994/911945

-1voto

João Vitor Gomes Points 107

Les classes sont comme des plans pour créer des objets. Faisons une métaphore avec la construction d'une maison. Vous avez le plan de la maison donc vous pouvez construire une maison. Vous pouvez construire autant de maisons que vos ressources le permettent.

Dans cette métaphore, le plan est la classe et la maison est l'instanciation de la classe, créant un objet.

Les maisons ont des attributs communs comme avoir un toit, un salon, etc. C'est là que votre méthode init va. Elle construit l'objet (maison) avec les attributs que vous souhaitez.

Supposons que vous ayez :

`classe maison :`
`toit = True`
`def __init__(self, couleur):`
`self.couleurmur = couleur`

>> créer la maison de Petit Poucet :

>> petitpoucet = maison() #() invoque la classe maison, pas la fonction

>> petitpoucet.toit

>> True

toutes les maisons ont des toits, maintenant définissons la couleur des murs de Petit Poucet en blanc :

>> petitpoucet.couleurmur = 'blanc'
>>petitpoucet.couleurmur
>> 'blanc'

-1voto

Dinesh Ravi Points 13

Essayez ceci et vérifiez la différence

class test:
    f = 3

    def __init__(s, f):
        s.__class__.f = f
        s.f = s.__class__.f
        print(f'def __init__(s, {f})')
        print(f's.__class__.f = {f}')
        print(f's.f={s.__class__.f}')
        print(f'f={f}')
        print('===============init terminé===========')

    def setinstancetoOne(s, f):
        print(f'def setinstancetoOne(s, {f})')
        s.f = f

    print(f'class var f = {f}')

    def useClassname(test):
        print(f'>>>>def useClassname({test})')
        print(f'test.f {test.f}')

    def p_method(s):
        print(f'>>>>def p_method({s})')
        print(f's.f {s.f}')
        print(f'test.f {test.f}')
        print(f's.__class__.f {s.__class__.f}')

    print(f'class var f={f}')

# test.__init__.f = 19
t = test(2)
t.useClassname()
t.p_method()
print(f'En dehors de la classe t.f {t.f}')
print(f'En dehors de la classe test.f {test.f}')

print('______différence__________')
t = test(2)
t.setinstancetoOne(1)
t.useClass()
t.p_method()
print(f'En dehors de la variable d'instance de classe (2) {t.f}')
print(f'En dehors de la variable de classe (3) {test.f}')

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