【问题标题】:why do we pass self on all class methods? [duplicate]为什么我们在所有类方法上都传递 self ? [复制]
【发布时间】:2021-12-13 21:47:19
【问题描述】:

我知道你们中的一些人会认为这是一个愚蠢的问题,但我还是会问。

为什么我们需要在所有类方法上传递“self”,我们不能像这样不传递它就使用它:

class Player:
    def __init__(name):
        self.name = name 
    
    def print_player_name():
        print(self.name)

【问题讨论】:

  • 我相信这就是 python 的工作方式。我可以想象my_player.print_player_name()实际上调用Player.print_player_name(my_player)
  • 这就像将一个对象传递给函数,只是 self 代表类本身。
  • 另请注意,您的示例中的方法更恰当地称为“实例方法”。术语“类方法”有点不同,传统上使用cls 而不是self。它们由 @classmethod 装饰器进行处理,并应用于整个类而不是类的特定对象(或实例)。此外,在实例方法中使用 self 并在类方法中使用 cls 只是约定,因为该语言将允许您将其命名为不同的名称。
  • 您传递self 以便引用该类的实例。有时您希望一个类的多个实例甚至一个类的实例调用同一类的另一个实例。如果您没有理由在该类的该实例中引用任何其他内容,则可以创建一个 staticmethod,它是该类的一部分,但与该类中的数据无关。
  • What is the rationale for closing "why" questions on language design? -- Python 语法需要什么 的问题在这里被反复询问和回答;重新审视它是没有意义的。它是否应该这样做的问题完全是题外话。

标签: python


【解决方案1】:

很简单,就是官方的Pythonconvention。在官方文档中我们可以read 了解它。

“通常,方法的第一个参数称为self。这没什么 不仅仅是一个约定:self这个名字绝对没有什么特别之处 对 Python 的意义。但是请注意,不遵守约定 你的代码对于其他 Python 程序员来说可能不太可读,而且它是 也可以想象,一个类浏览器程序可以写成 依赖于这样的约定。”

【讨论】:

    【解决方案2】:

    self 表示调用方法的类的对象您并不总是需要将其命名为 self[标准约定] python 中允许任何有效的变量名来执行此操作,但它应该是非类方法的第一个参数并且应该替换 self ,如果您运行此 python 将按预期工作:

    class Player:
        def __init__(hello, name):
            hello.name = name 
        
        def print_player_name(hello):
            print(hello.name)
    

    【讨论】:

      【解决方案3】:

      是的,您可以这样做,但您必须将其提及为static method。 Self 表示类的实例。简单来说,self 表示正在执行它的对象。创建对象时,所有变量都会根据同一类的不同对象更改其值。每个类都需要对象作为参数,因为对于不同的对象,分配了不同的值

      【讨论】:

        【解决方案4】:

        试试看。它不起作用,因为 self 没有定义。 “self”这个名字刚刚成立,但你可以随意命名。它指的是调用该方法的类的对象。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-01-02
          • 2022-01-04
          • 2015-08-09
          • 2020-03-19
          • 2020-02-07
          • 2020-05-14
          • 2014-05-01
          • 2012-11-08
          相关资源
          最近更新 更多