python在方法中使用”self”

python and using 'self' in methods

据我所读/理解,"self"参数与"this"类似。

是真的吗?

如果它是可选的,那么如果self没有"传入"方法,您会怎么做?


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


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来说,这是如何发生的。

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

python文档做得很好:

1
2
3
xf = x.f
while True:
   print xf()

will continue to print hello world until the end of time.

What exactly happens when a method is called? You may have noticed that x.f() was called >without an argument above, even though the function definition for f() specified an >argument. What happened to the argument? Surely Python raises an exception when a function >that requires an argument is called without any — even if the argument isn’t actually >used...

Actually, you may have guessed the answer: the special thing about methods is that the >object is passed as the first argument of the function. In our example, the call x.f() is >exactly equivalent to MyClass.f(x). In general, calling a method with a list of n arguments >is equivalent to calling the corresponding function with an argument list that is created >by inserting the method’s object before the first argument.


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

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

但是,你可以把它称为self以外的东西,但我从未见过。


selfthis非常相似,但是在python中,self这个名称只是一个约定,可以命名任何其他名称。变量是以函数原型(def function(whatever, params...):)中的任何调用命名的。

例如方法,实际需要self。对于类或静态方法,您需要指定将它们视为类或静态方法,然后不需要self。例如:

1
2
3
4
5
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实例将隐式地传递到drive方法中作为第一个参数(self)。

1
2
3
4
5
6
class Car:
    def drive(self):
        self.do_some_stuff()

my_car = Car()
my_car.drive() # actually calls Car.drive(my_car)


EDOCX1 0是指调用该方法的对象,非常类似于C++中的EDCOX1(2)。但重要的是,self只是一个约定,您可以根据自己的喜好命名它,并传递子类的实例。


在类中,需要一个self变量(或类方法的cls)。但你想说的是你的决定。如果你愿意,可以叫它this

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

1
SomeObject.some_class_method()

而一个普通的方法需要你去做

1
2
3
SomeObject().some_normal_method()
or
SomeObject.some_normal_method(instance)