python无自我

python无自我,python,class,self,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 我试着在\uuuu init\uuuu class d: def __init__(self,arg): global a a = a

这是以期望的方式工作的:

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
我试着在
\uuuu init\uuuu

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”就能编写的方法?

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

当删除self时,最终只有一个名为
a
的变量,该变量不仅在所有
d
对象之间共享,而且在整个执行环境中共享。
你不能仅仅因为这个原因而消除self。

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
,这是一种惯例,因此,如果您关心其他人阅读您的代码而不想杀死您,请遵守惯例

进一步阅读:


您真正想要实现什么?尝试使我的代码更具可读性。这将使它a)不那么通俗,b)不完整。当然
全局a
会导致
a
被所有实例共享。这几乎就是全局变量的定义。好的。。。所以我应该习惯在我的代码中有很多“self”?迈克:是的,句号,新的段落。你问的Python相当于“如何在C和C++中避免预处理器”,“很多”取决于你的观点,但显然比在其他语言中更多。它们太多可能暗示您的代码有问题。“显式优于隐式”从好的方面看,您不会试图在成员变量前面加上
m
,只是为了澄清在方法内部访问的名称空间:)好,我现在看到,theglobal语句将变量提升到了执行级别,这是一个很好的解释,但在一开始就误导了术语:我们所称的绑定方法已经有了实例(作为隐式的第一个参数),一个未绑定的方法(在Python2中,它有自己的类型;在Python3中,它只是一个普通函数,但概念仍然存在)仍然需要实例(作为显式的第一个参数)。这是我发布的第一个问题。我看到这个问题被评为-1,但我不知道为什么。是因为这个问题不适合这样做?还是因为我的回答不符合格式?德尔南:你不是完全正确。如果你定义了一个裸函数,将
self
作为它的第一个参数,然后将其分配给class对象,该类的任何实例都将作为绑定方法继承该函数。在这种情况下,您所做的只是创建一个函数,将其附加到一个类,然后它就变成了一个方法。但是,您是对的,
函数
的实际类型更改为
实例方法
@mike:Someone我不喜欢你的问题并投了反对票。通常来说,在原始问题中更具描述性比在评论中跟进要好。:)这与我所说的有什么冲突吗?