6

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

真的吗?

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

4

6 回答 6

5

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

于 2010-07-19T17:01:20.373 回答
3

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在不从绑定上下文调用时手动传递它们。

Python 文档做得很好

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

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

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

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

于 2010-07-19T17:02:45.643 回答
2

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

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

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

于 2010-07-19T17:02:32.773 回答
0

在类中需要一个self变量(或cls类方法)。你想怎么称呼它是你的决定。如果您愿意,可以this改为调用它。

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

SomeObject.some_class_method()

而正常的方法需要你做

SomeObject().some_normal_method()
or
SomeObject.some_normal_method(instance)
于 2010-07-19T17:01:09.860 回答
0

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

于 2010-07-19T17:02:36.580 回答
0

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)
于 2010-07-19T17:08:47.977 回答