Python 无自我
这个方法可以按预期的方式工作:
class d:
def __init__(self,arg):
self.a = arg
def p(self):
print "a= ",self.a
x = d(1)
y = d(2)
x.p()
y.p()
得到的结果是
a= 1
a= 2
我尝试去掉“self”,并在 __init__
中使用全局声明
class d:
def __init__(self,arg):
global a
a = arg
def p(self):
print "a= ",a
x = d(1)
y = d(2)
x.p()
y.p()
结果却不太理想:
a= 2
a= 2
有没有办法写成不需要用“self”的样子?
3 个回答
0
当你去掉self的时候,最后只会剩下一个叫a
的变量,这个变量不仅会在所有的d
对象之间共享,还会在你整个运行环境中共享。因为这个原因,你不能随便去掉self。
6
"self" 是 Python 工作的方式。所以答案是:不!如果你想剪头发:你不一定要用 "self"。用其他任何名字也可以哦。;-)
4
在Python中,方法其实就是和类或类的实例绑定在一起的函数。它们之间唯一的区别是,方法(也叫绑定函数)会把实例对象作为第一个参数来使用。而当你从一个实例调用方法时,它会自动把这个实例作为第一个参数传进去。所以,当你在方法里定义了self
,其实是在告诉它要用哪个命名空间。
这样,当你写self.a
时,方法就知道你是在修改这个实例里的变量a
,而不是其他地方的变量。
Python的作用域是从内到外的,所以每个函数(或方法)都有自己的命名空间。如果你在方法p
里创建了一个局部变量a
(这些名字真不好),它和self.a
是完全不同的。下面是用你代码的例子:
class d:
def __init__(self,arg):
self.a = arg
def p(self):
a = self.a - 99
print "my a= ", a
print "instance a= ",self.a
x = d(1)
y = d(2)
x.p()
y.p()
这会产生:
my a= -98
instance a= 1
my a= -97
instance a= 2
最后,你不一定要把第一个变量叫self
。你可以随便起个名字,虽然其实不太建议这么做。通常在方法里定义和引用self
是个约定,所以如果你在意别人看你的代码时不会想杀了你,就最好遵循这个约定!
想了解更多,可以看看: