Python 无自我

4 投票
3 回答
693 浏览
提问于 2025-04-16 16:07

这个方法可以按预期的方式工作:

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是个约定,所以如果你在意别人看你的代码时不会想杀了你,就最好遵循这个约定!

想了解更多,可以看看:

撰写回答