开发者

python and using 'self' in methods

From what I read/understand, the 'self' para开发者_StackOverflowmeter is similiar to 'this'.

Is that true?

If its optional, what would you do if self wasnt' passed into the method?


Yes, it's used in similar ways. Note that it's a positional parameter and you can call it what you want; however there is a strong convention to call it self (not this or anything else). Some positional parameter must be there for a usable instance method; it is not optional.


The joy of Python

That is true to some extend. Methods are bound to the object instance they are a part of. When you see

def some_func(self, foo, bar)

The passing of self is sometimes implicit when you call, for example:

obj.some_func(foo_val, bar_val)

Which is equal (presuming obj is of class MyClass) to

MyClass.some_func(obj, foo_val, bar_val)

Because the method is bound to obj, the self argument gets populated. This is part of Python being explicit with what it means. In other languages, this just pops into scope, with Python there is some exposure of how this happens.

You can also pass methods around, and manually pass them self when not calling from a bound context.

The Python docs do a good Job:

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.


self is this, just you have to explicitly pass it and explicitly use it to refer to class methods/properties.

It isn't optional in class methods. You will get a TypeError if you try to define a classmethod without at least one argument (i.e., the self parameter).

However, you can call it something other than self, but I have never seen otherwise.


self refers to the object on which the method was called, much like this in C++. But it is important that self is merely a convention, you can name it as you like and pass instances of subclasses.


In classes a self variable (or cls for classmethods) is required. What you want to call it is your decision though. If you prefer you could call it this instead.

A classmethod is a method that gets the class as a first argument instead of a instance. It can be called without passing an instance. i.e. with a classmethod you can do:

SomeObject.some_class_method()

while a normal method would require you to do

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


self is definitely similar to this, however, in Python, the name self is just a convention, and could be named anything else. The variable is named after whatever you call it in the function's prototype (def function(whatever, params...):).

For instance methods, self IS actually required. For class or static methods, you need to specify that they should be treated as such, and then self is not required. For example:

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)      

You will never be able to use an instance method in such a way that self is not passed in. For example, if I have an instance my_car of a Car class, and I use the Car class's drive instance method, the my_car instance will be implicitly passed into the drive method as the first parameter (self).

class Car:
    def drive(self):
        self.do_some_stuff()

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

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜