python并在方法中使用'self'

时间:2010-07-19 16:58:41

标签: python self

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

这是真的吗?

如果它是可选的,如果self没有“传入方法,你会怎么做?”

6 个答案:

答案 0 :(得分:5)

是的,它以类似的方式使用。请注意,它是一个位置参数,您可以根据需要调用它;但是有一个强烈的惯例叫它self(不是this或其他任何东西)。一些位置参数必须用于可用的实例方法;它不是可选的。

答案 1 :(得分:3)

Python的喜悦

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

def some_func(self, foo, bar)

当你打电话时,自我的传递有时是 ,例如:

obj.some_func(foo_val, bar_val)

哪个相等(假设obj属于MyClass}到

MyClass.some_func(obj, foo_val, bar_val)

由于该方法绑定到obj,因此会填充self参数。这是Python明确表达意思的一部分。在其他语言中,this只是弹出范围,使用Python可以了解这种情况。

您还可以传递方法,并在不从绑定上下文调用时手动传递它们。{/ p>

The Python docs do a good Job

self
  

将继续打印你好世界,直到时间结束。

     

调用方法时究竟发生了什么?您可能已经注意到x.f()被调用>没有上面的参数,即使f()的函数定义指定了一个>参数。这个论点怎么了?当一个函数>需要一个参数被调用而没有任何东西时,Python肯定会引发异常 - 即使该参数实际上并未被使用...

     

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

答案 2 :(得分:2)

selfthis,只需要明确传递它并明确地使用它来引用类方法/属性。

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

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

答案 3 :(得分:0)

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

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

SomeObject.some_class_method()

虽然正常方法需要你做

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

答案 4 :(得分:0)

self指的是调用该方法的对象,非常类似于C ++中的this。但重要的是self仅仅是约定,您可以根据需要对其进行命名并传递子类的实例。

答案 5 :(得分: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)