根据我的阅读/理解,“self”参数类似于“this”。
真的吗?
如果它是可选的,如果 self 没有传递到方法中,你会怎么做?
是的,它以类似的方式使用。请注意,它是一个位置参数,您可以随意调用它;但是有一个强大的约定来称呼它self
(不是this
或其他任何东西)。对于可用的实例方法,必须有一些位置参数;这不是可选的。
Python的乐趣
这在某种程度上是正确的。方法绑定到它们所属的对象实例。当你看到
def some_func(self, foo, bar)
当你调用时,self 的传递有时是隐含的,例如:
obj.some_func(foo_val, bar_val)
哪个等于(假设obj
是 class MyClass
)
MyClass.some_func(obj, foo_val, bar_val)
因为方法绑定到obj
,所以self
参数被填充。这是 Python 明确其含义的一部分。在其他语言中,this
只是突然出现在范围内,而 Python 则揭示了这是如何发生的。
您还可以传递方法,并self
在不从绑定上下文调用时手动传递它们。
xf = x.f
while True:
print xf()
将继续打印 hello world 直到时间结束。
调用方法时究竟会发生什么?您可能已经注意到 xf() 的调用 > 上面没有参数,即使 f() 的函数定义指定了 > 参数。争论是怎么回事?当一个需要参数的函数在没有任何参数的情况下被调用时,Python 肯定会引发异常——即使参数实际上没有被使用......
实际上,你可能已经猜到答案了:方法的特殊之处在于 >object 作为函数的第一个参数传递。在我们的示例中,调用 xf() > 完全等同于 MyClass.f(x)。通常,调用具有 n 个参数的列表的方法 > 等效于调用具有创建的参数列表的相应函数 > 通过在第一个参数之前插入方法的对象。
self
是this
,只是您必须显式传递它并显式使用它来引用类方法/属性。
它在类方法中不是可选的。TypeError
如果您尝试定义一个没有至少一个参数(即参数)的类方法,您将得到一个self
。
但是,您可以将其称为 以外的其他名称self
,但我从未见过其他名称。
在类中需要一个self
变量(或cls
类方法)。你想怎么称呼它是你的决定。如果您愿意,可以this
改为调用它。
Aclassmethod
是一个方法,它获取class
作为第一个参数而不是实例。它可以在不传递实例的情况下调用。即classmethod
你可以这样做:
SomeObject.some_class_method()
而正常的方法需要你做
SomeObject().some_normal_method()
or
SomeObject.some_normal_method(instance)
self
指调用方法的对象,很像this
C++ 中的。但重要的self
是,这只是一个约定,您可以随意命名并传递子类的实例。
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 的方式使用实例方法。例如,如果我有一个my_car
类的实例Car
,并且我使用Car
该类的drive
实例方法,则该my_car
实例将隐式传递给该drive
方法作为第一个参数(self
)。
class Car:
def drive(self):
self.do_some_stuff()
my_car = Car()
my_car.drive() # actually calls Car.drive(my_car)