2016-02-26 78 views
3

self.x+self.yx+y在下面的代码有什么区别?python局部变量vs自我

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

+0

的可能的复制[Python中:类和实例之间的区别属性(http://stackoverflow.com/questions/207000/python-difference-between-class-and-instance-属性) – idjaw

+2

@idjaw我不认为这是你链接问题的重复。在这个问题中没有一个实例属性,所以它不是混淆类和实例属性。 –

+6

在第一个'add'中,您添加了'self'对象的属性值。在第二个'add2'中,您正在添加参数的值。 –

回答

1

不同的是,当你使用自己你是指你的类

的实例的成员当您使用X和Y dirrectly你指的是你在你的函数

此使用参数是你的类的简化

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 
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' 
+0

谢谢大家 –

1

当一个类被调用时,所述第一参数(按照惯例命名self)被设置为类的实例。当方法访问self的属性时,它访问类实例中的那些属性,并且它们的值在该实例中保留。另一方面,如果一个类方法访问裸露变量,那些变量对于这些方法来说是严格局部的,并且它们的值不会在对该实例的类方法的调用中持续存在。

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
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