атрибуты в классе Python - PullRequest
       32

атрибуты в классе Python

1 голос
/ 19 ноября 2011

У меня проблема с обновлением атрибутов в классе Python, я приведу небольшой пример.

#!/usr/bin/python
# -*- coding: utf-8 -*-
class myClass():
    def __init__(self):
        self.s=0
        self.procedure()
    def procedure(self):#{{{
        s=self.s
        print s
        self.operation()
        print s
    def operation(self):#{{{                                                                                            
        s=self.s
        s+=1
        self.s=s
        print "o:",self.s
c=myClass()

затем выведите

0
o: 1
0

почему последнее число равно 0, а не 1?

Ответы [ 4 ]

2 голосов
/ 19 ноября 2011

в myClass.procedure(), вы создаете локальное имя s со значением, скопированным из self.s, то есть 0myClass.operation() вы устанавливаете self.s на 1.Но вы не перезаписали свою предыдущую копию на s в myClass.procedure(), поэтому она по-прежнему 0.

1 голос
/ 19 ноября 2011

Потому что s = self.s не делает s другим именем для "что бы вы ни получили, проверяя self.s, всегда и навсегда"; это делает s другим названием для «того, на что self.s ссылается сейчас».

Целое число 0 является объектом. В первой функции вы заставляете self.s и s оба ссылаться на этот объект, а затем заставляете self.s ссылаться на что-то другое (результат сложения) через другую s, локальную для другой функции , s локально по отношению к первой функции не изменяется.

1 голос
/ 19 ноября 2011

Ваш код procedure должен выглядеть следующим образом:

def procedure(self):#{{{
        s=self.s
        print s
        self.operation()
        # the following line is edited
        print self.s

В противном случае изменяемая вами переменная (self.s) не печатается.

1 голос
/ 19 ноября 2011

Вы печатаете s вместо self.s в последнем отпечатке.

...