2016-02-26 49 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