如何避免在Python中显式的“自我”?

我一直在学习python遵循一些pygame教程 。

其中我发现广泛使用了关键字self ,并且主要来自Java背景,我发现我一直忘记inputself 。 例如,而不是self.rect.centerx我会inputrect.centerx ,因为,对我来说, 矩形已经是该类的成员variables。

对于这种情况,我可以想到的Java并行处理必须将所有对成员variables的引用加上前缀。

我坚持用自己的所有成员variables前缀,还是有一种方法来宣布他们,让我可以避免这样做?

即使我所build议的不是pythonic ,我仍然想知道是否有可能。

我已经看了这些相关的SO问题,但是他们并没有完全回答我的问题:

  • Python – 为什么在一个类中使用“self”?
  • 为什么你需要在Python方法中明确地拥有“自我”的参数?

Python需要指定自我。 结果是,对于什么是成员,什么不是成员,即使没有完整的类定义,也不会有任何混淆。 这会导致有用的属性,例如:不能添加意外遮蔽非成员的成员,从而破坏代码。

一个极端的例子:你可以写一个类,而不需要知道它可能拥有什么基类,并且总是知道你是否访问一个成员:

 class A(some_function()): def f(self): self.member = 42 self.method() 

这是完整的代码! (some_function返回用作基地的types。)

另外,一个类的方法是dynamic组成的:

 class B(object): pass print B() # <__main__.B object at 0xb7e4082c> def B_init(self): self.answer = 42 def B_str(self): return "<The answer is %s.>" % self.answer # notice these functions require no knowledge of the actual class # how hard are they to read and realize that "members" are used? B.__init__ = B_init B.__str__ = B_str print B() # <The answer is 42.> 

请记住,这两个例子都是极端的,你不会每天都看到它们,我也不build议你经常写这样的代码,但是它们清楚地显示了自己被明确需要的方面。

其实self不是一个关键字,它只是传统给Python中实例方法的第一个参数的名字。 而且第一个参数不能被忽略,因为它是一个方法知道你的类的哪个实例被调用的唯一机制。

例如,你可以使用任何你想要的名字

 class test(object): def function(this, variable): this.variable = variable 

甚至

 class test(object): def function(s, variable): s.variable = variable 

但你坚持使用范围的名称。

我不build议你使用与自己不同的东西,除非你有一个令人信服的理由,因为这会使经验丰富的pythonistas变得陌生。

是的,你必须总是指定self ,因为根据Python的哲学,显式比隐式更好。

你也会发现你用python编程的方式与你在java中编程的方式有很大的不同,因此对self的使用往往会减less,因为你不会在对象内部投射任何东西。 相反,您可以更大程度地使用模块级function,这可以更好地进行testing。

顺便一提。 起初我讨厌它,现在我讨厌相反。 相同的缩进驱动stream量控制。

self是用于访问对象成员的Python语法的一部分,所以恐怕你会陷入困境

“self”是类的当前对象实例的常规占位符。 当你想引用对象的属性或者类中的方法或者方法时,就使用它,就好像你指的是“自身”一样。 但是为了缩短Python编程领域中的某个人开始使用“self”,其他领域使用“this”,但是他们将其作为不能被replace的关键字。 我宁愿使用“其”来增加代码的可读性。 它是Python中的好东西之一 – 你可以自由地select自己的占位符而不是“self”。 自我示例:

 class UserAccount(): def __init__(self, user_type, username, password): self.user_type = user_type self.username = username self.password = encrypt(password) def get_password(self): return decrypt(self.password) def set_password(self, password): self.password = encrypt(password) 

现在我们用“它”代替“自我”:

 class UserAccount(): def __init__(its, user_type, username, password): its.user_type = user_type its.username = username its.password = encrypt(password) def get_password(its): return decrypt(its.password) def set_password(its, password): its.password = encrypt(password) 

现在更可读?

是的,自己很乏味。 但是,是更好?

 class Test: def __init__(_): _.test = 'test' def run(_): print _.test 

From: Self Hell – 更有状态的function。

混合的方法效果最好。 所有实际进行计算的类方法都应该移入闭包,并且清理语法的扩展应保存在类中。 把闭包塞进类中,像处理命名空间一样对待类。 closures本质上是静态的function,所以不需要自我*,即使在课堂上…

其实你可以使用Armin Ronacher演示文稿“五年不好的想法”(谷歌它)的配方“隐式自我”。

这是一个非常聪明的秘诀,就像Armin Ronacher几乎所有的东西一样,但我不认为这个想法是非常有吸引力的。 我想我更喜欢在C#/ Java中明确这一点