以下代码中self.x+self.y
和x+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
?
答案 0 :(得分:3)
在add
中,您正在调用类变量并忽略方法参数x
和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
在类范围中定义x
和y
时,它会使它们成为类变量。它们是类m2
的一部分,您甚至不需要创建m2
的实例来访问它们。
print m2.x, m2.y
>> 4, 5
但是,您也可以通过实例访问它们,就好像它们是像这样的实例变量:
m = m2()
print m.x, m.y
>> 4, 5
这背后的原因是解释器将查找名称为self.x
和self.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'