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