方法在所属的类定义了实例时,方法才绑定了那个实例,没有实例的时候,方法就是未绑定状态,而定义方法的时候,第一个参数都是self,代表的是调用此方法的实例
在实例调用方法的时候,由于实例都是作为第一个参数传递到方法调用中的,也就是self变量引用了方法所绑定的实例,所以在方法定义上第一个参数必须是self
在方法中可以没有用到self,比如仅仅打印一个hello world,这时候就没有使用到调用该方法的实例,也就是没有与类进行关联,那可以定义一个普通的函数即可
对于调用绑定的方法,也就是已经创建了一个实例来调用此方法,只需要myclass.foo()即可;而在实例调用绑定的方法的时候,self不需要明确传入,会自己作为第一个参数传入
__author__ = 'LiHui' class MyClass(object): def __init__(self): self.a = 1 def foo(self): print self.a if __name__ == '__main__': myclass = MyClass() myclass.foo()
假如是非绑定的方法,也就是没有一个明确的实例来调用,比如下面例子
__author__ = 'LiHui' class MyClass(object): def __init__(self): self.a = 1 def foo(self): print self.a class MyChildClass(MyClass): def __init__(self): self.a = 2 MyClass.__init__(self) if __name__ == '__main__': myclass = MyChildClass() myclass.foo()
派生出来的MyChildClass,构造器将基类MyClass里的__init__给覆盖了,这样self.a的值就变为了2,而想要重新调用基类构造器,把self.a指向对象1,此时就是调用了非绑定方法,子类调用基类的构造器,但是基类是没有实例的,所以传递了基类构造器所需要的self参数,通过基类类名来调用,关键就是记得要传入self参数