如何在Python中为静态方法选择语法?

Uri*_*Uri 14 python syntax static language-history

我已经使用Python一段时间了,我发现将方法声明为静态的语法是特殊的.

将声明一个常规方法:

def mymethod(self, params)
   ...
   return
Run Code Online (Sandbox Code Playgroud)

声明了一个静态方法:

def mystaticethod(params)
   ...
   return
mystaticmethod = staticmethod(mystaticmethod)
Run Code Online (Sandbox Code Playgroud)

如果您不添加静态方法行,编译器会抱怨自我丢失.

这是一种非常简单的非常简单的方法,在其他语言中只需使用关键字和声明语法.谁能告诉我这种语法的演变?这仅仅是因为课程被添加到现有语言中吗?

由于我可以将staticmethod行移动到类的后期,因此它还表明解析器在簿记方面的工作量更大.

请注意,我知道稍后添加的装饰器语法,我很想知道从语言设计角度来看原始语法是如何产生的.我能想到的唯一想法是staticmethod应用程序调用一个将函数对象转换为静态方法的操作.

Mic*_*and 12

在类之后很久就将静态方法添加到Python中(很早就添加了类,甚至可能在1.0之前添加;静态方法直到大约2.0时才显示).它们是作为常规方法的修改实现的 - 您从函数创建静态方法对象以获取静态方法,而编译器默认生成实例方法.

与Python中的许多内容一样,静态方法已经引入,然后在人们使用它们时进行了改进,并希望获得更好的语法 第一轮是引入语义而不向语言添加新语法的一种方式(Python对语法更改非常有抵抗力).我不是Guido,所以我不确定他脑子里发生了什么,这有些推测,但Python倾向于缓慢移动,逐步发展,并在他们获得更多经验时改进事物(特别是他们不喜欢添加一些东西,直到他们找到了正确的方法.这可能就是为什么从一开始就没有静态方法的特殊语法.

正如mjv所指出的那样,现在有一种更简单的方法,通过2.2或2.3中添加的称为"装饰器"的一些语法糖:

@staticmethod
def mystaticmethod(params)
    ...
    return
Run Code Online (Sandbox Code Playgroud)

@staticmethod语法糖把mystaticmethod = staticmethod(mystaticmethod)方法定义之后.


Ale*_*lli 11

voyager和adurdin在他们之间做了很好的解释所发生的事情:随着Python 2.2中新风格的类和描述符的引入,出现了新的和深层的语义可能性 - 以及最明显有用的例子(静态方法,类方法)没有任何新语法的内置描述符类型支持(属性)(@foo一旦新描述符充分证明了它们的真实用途,装饰器的语法后来添加了几个版本).我不是真的有资格引导Guido(当你需要他的时候是Tim Peters!),但我当时已经是Python的提交者并且参与了这些开发,我可以确认确实发生了什么.

旅行者对此的观察提醒他C是正确的目标:我一直声称Python比任何模仿C 语法的语言都捕获了更多的"C精神" (括号,括号后if/while)等)."C的精神"实际上是在ISO C标准的(非规范性)基本原理部分中描述的,并且包含五个原则(没有一个需要括号! - ),我声称Python匹配4.5(有几个视频在关于"Python for Programmers"的我的演示文稿,如果你很好奇,我会在这里介绍它.

特别是,C之灵"只提供一种操作方式"与Python的"应该有一个 - 最好只有一个 - 显然是这样做的方式"相匹配 - 而C和Python,我相信,是唯一两种广泛采用这种设计理想的均匀性和非冗余的语言(它是一种理想的,并且不能明智地达到100% - 例如,如果a和b是整数,a + b和b +更好的是两种相同的方式来获得他们的总和! - ) - 但这是一个目标! - ).