python自我

时间:2011-04-20 19:01:46

标签: python class self

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

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

我尝试在__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

有没有办法在不必使用“自我”的情况下编写它?

3 个答案:

答案 0 :(得分:6)

“self”是Python的工作方式。所以答案是:不!如果你想剪头发:你不必使用“自我”。任何其他名称也会。 ;-)

答案 1 :(得分:4)

Python方法只是绑定到类的类或实例的函数。唯一的区别是方法(也称为绑定函数)期望实例对象作为第一个参数。此外,当您从实例调用方法时,它会自动将实例作为第一个参数传递。因此,通过在方法中定义self,您可以告诉它要使用的命名空间。

这样,当您指定self.a时,该方法知道您正在修改实例名称空间中的实例变量a

Python范围从内到外工作,因此每个函数(或方法)都有自己的命名空间。如果您在方法a中本地创建变量p(这些名称很糟糕BTW),则它与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,所以如果你完全关心其他人阅读你的代码而不想杀死你,那么坚持惯例!

进一步阅读:

答案 2 :(得分:0)

删除self时,最终只有一个名为a的变量,不仅会在所有d个对象中共享,还会在整个执行环境中共享。 因此,你不能仅仅消除自我。