python局部变量vs self

时间:2016-02-26 16:55:25

标签: python scope

以下代码中self.x+self.yx+y之间的区别是什么?

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

为什么self.x + self.y返回9 vs x + y会返回3

5 个答案:

答案 0 :(得分:3)

add中,您正在调用类变量并忽略方法参数xy

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

在类范围中定义xy时,它会使它们成为类变量。它们是类m2的一部分,您甚至不需要创建m2的实例来访问它们。

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

但是,您也可以通过实例访问它们,就好像它们是像这样的实例变量:

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

这背后的原因是解释器将查找名称为self.xself.y的实例变量,如果找不到它们,则默认为类变量。

阅读python documentation中有关类属性的更多信息。

答案 1 :(得分:1)

不同之处在于,当你使用self时,你会引用你的类实例的成员

当你直接使用X和Y时,你可以参考你在函数中使用的参数

这是您班级的简化

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

答案 2 :(得分:1)

调用类方法时,第一个参数(按约定命名为self)设置为类实例。当方法访问self的属性时,它正在访问类实例中的那些属性,并且它们的值在该实例中保持不变。

另一方面,如果类方法访问裸变量,那些变量对于那些方法是严格本地的,并且它们的值不会在对该实例的类方法的调用中持续存在。

答案 3 :(得分:1)

class m2:
    x, y = 4, 5 #This are class attributes
    def add(self, x, y ):
            return self.x + self.y # This are instance variables
    def add2(self, x, y ):
            return x + y # This are local variables

类变量对于类的每个实例都是通用的。实例变量仅适用于该实例。局部变量只能在函数范围内使用。

add中,当您执行self.x时,它会引用类变量x,因为它也是实例的一部分。在add2中,它引用了局部变量

如果这些方法是class methods or static methods(经适当调整)

,则可以获得相同的结果

班级方法:

class m2:

    x, y = 4, 5

    @classmethod
    def add(cls, x, y):
        return cls.c + cls.y #Here you're calling class attributes

    @classmethod
    def add2(cls, x, y):
        return x + y

结果:

>>> m.add(1,2)
9
>>> m.add2(1,2)
3

静态方法:

class m2:
    x, y = 4, 5

    @staticmethod
    def add(x, y):
        return m2.c + m2.y #Here you need to call the class attributes through the class name

    @staticmethod
    def add2(x, y):
        return x + y

结果:

 >>> m2.add(1,2)
 9
 >>> m2.add2(1,2)
 3

答案 4 :(得分:0)

默认情况下,x和y将是本地的。 self.x和self.y在该实例中持久化,x和y仅在本地存在。

class Dog():
    def __init__(self):
        x = "local"
        self.y = "instance"

d = Dog()
print(d.y)
#=> instance
print(d.x)
#=> AttributeError: Dog instance has no attribute 'y'