在Python中,以下代码有效:
class A:
def __init__(me):
me.foo = 17
def print_foo(myself):
print(myself.foo)
def set_foo(i, v):
i.foo = v
您可能已经注意到,self
参数在__init__
方法中命名为me
,在print_foo
方法中命名为{i
。在
有没有一种情况下,将self
参数命名为self
之外的其他参数是有用的吗?如果不是这样,为什么Python允许这样做,因为这无疑是编写一个难以阅读和维护的代码的方法,而且也是一个混淆的来源?在
PEP 8 addresses this pretty clearly:
虽然还记得作为python style guide this is not enforced
有时,像in ^{} ,使用类似}的东西可能会更清楚,因为
a,b
而不是{<your specific reasons>
《风格指南》实际上在上面的引文下面列出了一些可能打破惯例的原因:
你的问题的第一部分是:“有没有一种情况下,将self参数命名为self以外的东西是有用的?”我不知道有什么真正有说服力的案例,但即使有人提出了完美的例子,它们也很罕见,我也不会把它们作为这个设计选择的理由:正常使用远比偶尔以非直观的方式使用
self
重要得多。(请注意,强制使用名称self
不会阻止任何人完成任何事情;它只是一个名称。)那么python为什么允许这样做呢?这里有两个问题:为什么要求在参数中显式列出
self
(这给了我们选择另一个名称的机会),以及为什么不将self
变成关键字,比如在某些其他语言中this
。在为什么它不是一个关键字是非常清楚的:python的设计者总是尽量减少语言中保留字的数量(在引入新语法时,例如使用})时,尽一切努力重用已经保留的单词。因此,如果某件事可以合理地实现而不是保留字,那就是了。在
yield from
、from ... import
、和{一旦确定}的装饰器很简单。”)因此,一旦语言以这种方式设计,就真的没有回头路了。在
self
不是一个关键字,而是一个特殊的标识符,如何使其特殊?使它突然出现在每个类方法的locals()
字典中会引入“魔术”行为,这也是不可取的:“显式优于隐式。”因此,self
是通过在方法签名中声明来引入的,唯一特殊的行为是第一个参数绑定到我们调用其方法的对象。这使得通过修饰符支持静态方法和类方法变得很容易,而无需向语言添加特殊语法。(正如Guido的this post所解释的那样,“用纯Python编写一个实现@classmethod
或{self参数实际上只是按照约定命名self,而且这甚至不是一个普遍接受的约定——我还经常看到cls或这个被使用。在
术语self在python中并不像Java那样是一个关键字。用户可以选择为它命名任何他们想要的名称-尽管最好选择一个名称并在整个代码中坚持这个名称,但是没有任何东西阻止您在每个方法中为它命名不同的名称。在
相关问题 更多 >
编程相关推荐