【问题标题】:python and using 'self' in methodspython并在方法中使用'self'
【发布时间】:2010-07-19 16:58:40
【问题描述】:

根据我的阅读/理解,“self”参数与“this”类似。

这是真的吗?

如果它是可选的,如果没有将 self 传递给方法,你会怎么做?

【问题讨论】:

    标签: python self


    【解决方案1】:

    是的,它以类似的方式使用。请注意,它是一个位置参数,您可以随意调用它;但是有一个强烈的约定将其称为self(而不是this 或其他任何名称)。一些位置参数必须用于可用的实例方法;这不是可选的。

    【讨论】:

    • “它一定在那里”可能会暗示外行人 Itself。我想澄清一下,第一个参数必须存在并且将指向对象的一个​​实例。按照惯例,它被称为self,但如果您为混淆编码竞赛编写代码,您可以称它为不同的名称。
    【解决方案2】:

    Python 的乐趣

    这在某种程度上是正确的。方法绑定到它们所属的对象实例。当你看到

    def some_func(self, foo, bar)

    self的传递有时在你调用的时候是隐含的,例如:

    obj.some_func(foo_val, bar_val)

    等于(假设obj 属于MyClass 类)

    MyClass.some_func(obj, foo_val, bar_val)

    因为方法绑定到obj,所以self 参数被填充。这是 Python 明确其含义的一部分。在其他语言中,this 只是突然出现在范围内,而 Python 则揭示了这是如何发生的。

    您还可以传递方法,并在未从绑定上下文调用时手动传递它们self

    The Python docs do a good Job:

    xf = x.f
    while True:
       print xf()
    

    将继续打印 hello world 直到时间结束。

    调用方法时究竟会发生什么?您可能已经注意到 x.f() 被调用时 > 上面没有参数,即使 f() 的函数定义指定了 > 参数。争论是怎么回事?当一个需要参数的函数在没有任何参数的情况下被调用时,Python 肯定会引发异常——即使参数实际上没有被使用......

    其实你可能已经猜到答案了:方法的特别之处在于>object作为函数的第一个参数传递。在我们的示例中,调用 x.f() > 完全等同于 MyClass.f(x)。通常,调用具有 n 个参数列表的方法 > 等效于调用具有创建的参数列表的相应函数 > 通过在第一个参数之前插入方法的对象。

    【讨论】:

      【解决方案3】:

      selfthis,只是你必须显式传递它并显式使用它来引用类方法/属性。

      在类方法中它不是可选的。如果您尝试定义一个没有至少一个参数的类方法(即self 参数),您将获得TypeError

      但是,您可以将其称为 self 以外的其他名称,但我从未见过其他名称。

      【讨论】:

      【解决方案4】:

      self 指的是调用方法的对象,很像 C++ 中的this。但重要的是self 只是一个约定,你可以随意命名它并传递子类的实例。

      【讨论】:

        【解决方案5】:

        在类中需要self 变量(或cls 用于类方法)。你想怎么称呼它是你的决定。如果您愿意,也可以将其命名为 this

        classmethod 是一种将class 作为第一个参数而不是实例的方法。它可以在不传递实例的情况下调用。 即使用classmethod,您可以这样做:

        SomeObject.some_class_method()
        

        虽然普通方法需要您这样做

        SomeObject().some_normal_method()
        or
        SomeObject.some_normal_method(instance)
        

        【讨论】:

        • 不,在 Python 中 static methods 是不同的。
        • @Matthew Flaschen 是正确的。类方法接收对类的引用作为其第一个参数,静态方法没有必需的参数。
        【解决方案6】:

        self 绝对类似于this,然而,在 Python 中,名称 self 只是一个约定,可以命名为其他任何名称。该变量以您在函数原型 (def function(whatever, params...):) 中的名称命名。

        例如方法,self 实际上是必需的。对于类或静态方法,您需要指定它们应该被这样对待,然后self 不是必需的。例如:

        def type_to_display(type):
            """Converts a pass type to the full written pass type."""
            return list((pair[1] for pair in Pass.TYPE_CHOICES if pair[0] ==      
                                  type[0:1].upper()))[0]                          
        type_to_display = staticmethod(type_to_display)      
        

        您将永远无法以不传入 self 的方式使用实例方法。例如,如果我有一个 Car 类的实例 my_car,并且我使用 Car 类的drive 实例方法,my_car 实例将作为第一个参数(self)隐式传递给drive 方法。

        class Car:
            def drive(self):
                self.do_some_stuff()
        
        my_car = Car()
        my_car.drive() # actually calls Car.drive(my_car)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-11-08
          • 1970-01-01
          • 2023-03-07
          • 1970-01-01
          • 1970-01-01
          • 2012-09-04
          • 1970-01-01
          • 2013-09-11
          相关资源
          最近更新 更多