__init__ and arguments in Python

前端 未结 6 1339
我寻月下人不归
我寻月下人不归 2021-01-31 14:53

I want to understand arguments of the constructor __init__ in Python.

class Num:
    def __init__(self,num):
        self.n = num
    def getn(self)         


        
相关标签:
6条回答
  • 2021-01-31 15:14

    In Python:

    • Instance methods: require the self argument.
    • Class methods: take the class as a first argument.
    • Static methods: do not require either the instance (self) or the class (cls) argument.

    __init__ is a special function and without overriding __new__ it will always be given the instance of the class as its first argument.

    An example using the builtin classmethod and staticmethod decorators:

    import sys
    
    class Num:
        max = sys.maxint
    
        def __init__(self,num):
            self.n = num
    
        def getn(self):
            return self.n
    
        @staticmethod
        def getone():
            return 1
    
        @classmethod
        def getmax(cls):
            return cls.max
    
    myObj = Num(3)
    # with the appropriate decorator these should work fine
    myObj.getone()
    myObj.getmax()
    myObj.getn()
    

    That said, I would try to use @classmethod/@staticmethod sparingly. If you find yourself creating objects that consist of nothing but staticmethods the more pythonic thing to do would be to create a new module of related functions.

    0 讨论(0)
  • 2021-01-31 15:18

    Every method needs to accept one argument: The instance itself (or the class if it is a static method).

    Read more about classes in Python.

    0 讨论(0)
  • 2021-01-31 15:23

    In python you must always pass in at least one argument to class methods, the argument is self and it is not meaningless its a reference to the instance itself

    0 讨论(0)
  • 2021-01-31 15:33

    The fact that your method does not use the self argument (which is a reference to the instance that the method is attached to) doesn't mean you can leave it out. It always has to be there, because Python is always going to try to pass it in.

    0 讨论(0)
  • 2021-01-31 15:34

    If you print(type(Num.getone)) you will get <class 'function'>.

    It is just a plain function, and be called as usual (with no arguments):

    Num.getone() # returns 1  as expected
    

    but if you print print(type(myObj.getone)) you will get <class 'method'>.

    So when you call getone() from an instance of the class, Python automatically "transforms" the function defined in a class into a method.

    An instance method requires the first argument to be the instance object. You can think myObj.getone() as syntactic sugar for

    Num.getone(myObj) # this explains the Error 'getone()' takes no arguments (1 given).
    

    For example:

    class Num:
        def __init__(self,num):
            self.n = num
        def getid(self):
            return id(self)
    
    myObj=Num(3)
    

    Now if you

    print(id(myObj) == myObj.getid())    
    # returns True
    

    As you can see self and myObj are the same object

    0 讨论(0)
  • 2021-01-31 15:35

    The current object is explicitly passed to the method as the first parameter. self is the conventional name. You can call it anything you want but it is strongly advised that you stick with this convention to avoid confusion.

    0 讨论(0)
提交回复
热议问题