在Python中定义类的方法时,它看起来像这样:
class MyClass(object):
def __init__(self, x, y):
self.x = x
self.y = y
Run Code Online (Sandbox Code Playgroud)
但是在其他一些语言中,例如C#,您可以使用"this"关键字引用该方法绑定的对象,而不将其声明为方法原型中的参数.
这是一个有意的语言设计决策在Python或是否有一些实现细节需要传递"自我"作为参数?
我通过一些pygame教程学习Python .
在那里我发现了关键字self的广泛使用,并且来自主要的Java背景,我发现我一直忘记键入self.例如,而不是self.rect.centerx
我要输入rect.centerx
,因为对我来说,rect已经是类的成员变量.
对于这种情况,我可以想到的Java并行是必须使用此前缀对成员变量的所有引用作为前缀.
我是否坚持使用self为所有成员变量添加前缀,或者有没有办法声明它们可以让我避免这样做?
即使我建议的不是pythonic,我仍然想知道它是否可能.
我已经看过这些相关的SO问题,但他们并没有完全回答我的想法:
这两个班级有何不同?
class A():
x=3
class B():
def __init__(self):
self.x=3
Run Code Online (Sandbox Code Playgroud)
有什么显着差异吗?
我是Python新手(通常使用C#),在过去几天开始使用它.
在一个类中,您是否需要对该类数据成员和方法的任何调用加前缀?那么,如果我正在调用一个方法或从该类中获取一个值,那么我需要使用self.method()
或者self.intvalue
,例如?
我只是想检查一下我还没有遇到过那种冗长的方式.
Python是我最了解的语言,奇怪的是我仍然不知道为什么我在Java或PHP中键入"self"而不是"this".
我知道Python比Java早,但我无法弄清楚它是从哪里来的.特别是因为您可以使用任何名称而不是"自我":程序将正常工作.
那么这个约定来自哪里?
好吧,所以当我遇到这个时,我正在看一些来源:
>>> def __parse(self, filename):
... "parse ID3v1.0 tags from MP3 file"
... self.clear()
... try:
... fsock = open(filename, "rb", 0)
... try:
... fsock.seek(-128, 2)
... tagdata = fsock.read(128)
... finally:
... fsock.close()
... if tagdata[:3] == 'TAG':
... for tag, (start, end, parseFunc) in self.tagDataMap.items():
... self[tag] = parseFunc(tagdata[start:end])
... except IOError:
... pass
...
Run Code Online (Sandbox Code Playgroud)
所以,我决定测试一下.
>>> __parse("blah.mp3")
Run Code Online (Sandbox Code Playgroud)
而且,我收到了这个错误:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: __parse() takes exactly 2 arguments (1 …
Run Code Online (Sandbox Code Playgroud) 我不明白这些是用什么的,尤其是self
论证?有些人可以向我解释这个问题吗?为什么你要传递这个呢?
此外,我一直认为__init__
是'初始化',但我没有想过我以前从来没有在这里放任何东西.有人能给我一个简单的例子吗?
编辑:我每次看到self
被传递到函数或其他类似的东西时都会感到困惑.