【发布时间】:2010-07-19 16:58:40
【问题描述】:
根据我的阅读/理解,“self”参数与“this”类似。
这是真的吗?
如果它是可选的,如果没有将 self 传递给方法,你会怎么做?
【问题讨论】:
根据我的阅读/理解,“self”参数与“this”类似。
这是真的吗?
如果它是可选的,如果没有将 self 传递给方法,你会怎么做?
【问题讨论】:
是的,它以类似的方式使用。请注意,它是一个位置参数,您可以随意调用它;但是有一个强烈的约定将其称为self(而不是this 或其他任何名称)。一些位置参数必须用于可用的实例方法;这不是可选的。
【讨论】:
self。我想澄清一下,第一个参数必须存在并且将指向对象的一个实例。按照惯例,它被称为self,但如果您为混淆编码竞赛编写代码,您可以称它为不同的名称。
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 个参数列表的方法 > 等效于调用具有创建的参数列表的相应函数 > 通过在第一个参数之前插入方法的对象。
【讨论】:
self 是this,只是你必须显式传递它并显式使用它来引用类方法/属性。
在类方法中它不是可选的。如果您尝试定义一个没有至少一个参数的类方法(即self 参数),您将获得TypeError。
但是,您可以将其称为 self 以外的其他名称,但我从未见过其他名称。
【讨论】:
classmethod 与众不同。
self 指的是调用方法的对象,很像 C++ 中的this。但重要的是self 只是一个约定,你可以随意命名它并传递子类的实例。
【讨论】:
在类中需要self 变量(或cls 用于类方法)。你想怎么称呼它是你的决定。如果您愿意,也可以将其命名为 this。
classmethod 是一种将class 作为第一个参数而不是实例的方法。它可以在不传递实例的情况下调用。
即使用classmethod,您可以这样做:
SomeObject.some_class_method()
虽然普通方法需要您这样做
SomeObject().some_normal_method()
or
SomeObject.some_normal_method(instance)
【讨论】:
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)
【讨论】: