【问题标题】:Python 'self' for function用于函数的 Python 'self'
【发布时间】:2011-05-14 02:35:40
【问题描述】:

我已经阅读了关于“自我”的the SO post 解释,并且我已经阅读了关于课程的Python documentation。我想我了解在 Python 类中使用 self 以及其中的约定。

但是,对于 Python 及其习语来说相对较新,我无法理解为什么有些人在过程类型函数定义中使用 self。比如Python documentation on integer types中,示例函数为:

def bit_length(self):
    s = bin(self)       # binary representation:  bin(-37) --> '-0b100101'
    s = s.lstrip('-0b') # remove leading zeros and minus sign
    return len(s)       # len('100101') --> 6

self 替换为num 是相同的功能结果;即:

def bit_length(num):
    s = bin(num)       # binary representation:  bin(-37) --> '-0b100101'
    s = s.lstrip('-0b') # remove leading zeros and minus sign
    return len(s)       # len('100101') --> 6

没有像__init__ 这样的习语,我可以在这里看到为什么self 在第一种情况下被使用。我在程序函数的其他地方也看到过self 的这种用法,并且觉得它令人困惑。

所以我的问题是:如果没有类或方法,为什么在函数定义中使用self 而不是描述性参数名称?

【问题讨论】:

标签: python idioms self


【解决方案1】:

在示例中,bit_length 被定义为 int 类的函数,因此实际上存在一个“类或方法”。这个想法是你“要求”一个整数来给出它的 bit_length,因此它被定义为将 self 作为参数。

【讨论】:

  • 换句话说,文档显示了int 方法之一的等效(但效率低下)实现,这就是它使用self 的原因。
【解决方案2】:

没有真正的原因。但是,如果您要将其猴子补丁到现有的类上,那么它会为可能正在阅读代码的任何人提供一点通知。

【讨论】:

  • 这个。由于方法只是函数(嗯,主要是)def do_stuff(self): ...Clazz.do_stuff = do_stuff 与像往常一样定义方法 do_stuff 几乎相同,只是更丑陋/不明显/hacky,因此除非你是猴子补丁。
  • -1。不正确。文档显示了int 方法之一的等效实现,这就是它使用self 的原因。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-16
  • 1970-01-01
  • 2019-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多