python local variables vs self

What's the difference between self.x+self.y and x+y in the code below?

class m2:
    x, y = 4, 5
    def add(self, x, y):
        return self.x + self.y
    def add2(self, x, y):
        return x + y

>>> x = m2()
>>> print "x.add(self.x + self.y = )", x.add(1, 2)
x.add(self.x + self.y = ) 9
>>> print "x.add2(x + y = )", x.add2(1, 2)
x.add2(x + y = ) 3

Why does self.x + self.y return 9 vs x + y returns 3 ?


In add you are calling the class variables and ignoring the method arguments x and y .

class m2:

    # these variables are class variables and are accessed via self.x and self.y
    x, y = 4, 5  

    def add(self, x, y):
        return self.x + self.y  # refers to 4 and 5

    def add2(self, x, y):
        return x + y  # refers to input arguments x and y, in your case 1 and 2

When defining x and y in the class scope it makes them class variables. They are part of the the class m2 and you don't even need to create an instance of m2 to access them.

print m2.x, m2.y
>> 4, 5

However, you are also able to access them via an instance as if they were instance variables like this:

m = m2()
print m.x, m.y
>> 4, 5

The reason behind this is that the interpreter will look for instance variables with names self.x and self.y , and if they are not found it will default to class variables.

Read more about class attributes in the python documentation.


The difference is that when you use self you refer to the member of the instance of your class

When you use X and Y dirrectly you refer to the parameter that you use in your function

This is a simplification of your class

class m2:
    x_member1, y_member2 = 4, 5
    def add(self, x_parameter1, y_parameter2 ):
            return self.x_member1+ self.y_member2
    def add2(self, x_parameter1, y_parameter2 ):
            return x_parameter1 + y_parameter2

When a class method is called, the first argument (named self by convention) is set to the class instance. When the method accesses attributes of self , it is accessing those attributes in the class instance, and their values persist in that instance.

On the other hand, if a class method accesses bare variables, those variables are strictly local to those methods and their values do not persist across calls to class methods of that instance.

链接地址: http://www.djcxy.com/p/54290.html

上一篇: 无需初始化对象的访问类成员

下一篇: python局部变量vs self