代码改变世界

Python 进阶_OOP 面向对象编程_self 的实例绑定

2016-10-26 19:59  云物互联  阅读(91)  评论(0编辑  收藏  举报

目录

self 和绑定

在 Python 中 self 变量是特殊的, 其用于在实例方法中引用该方法所绑定的实例, 换句话说就是 Python 在实例化对象时会自动的将实例对象传递到类体的 self 变量中, 类体中的 self 变量代表了该类的实例对象. 实例方法无论在任何地方被调用, 实例对象总是作为第一个参数被传递进去, 从而实现了实例对象和实例方法的绑定, 这也是为什么同一个类可以实例化多个不同的实例化对象的原因之一.

所以, 当我们定义类实例方法, 在方法声明语句的参数列表中必须设置名为 self 的形参. 这也是类实例方法和常规方法最大的区别之一.
EXAMPLE:

In [5]: class AClass(object):
   ...:     def __init__(self, name):
   ...:         self.name = name
   ...:     def show_name(self):
   ...:         print self.name
   ...:         

In [6]: a_object = AClass('jmilkfan')

In [7]: a_object.show_name()
jmilkfan

调用非绑定的方法

那我们是不是不通过实例对象就一定没办法调用类实例方法了呢?
答案是否定的!

调用类实例方法的本质就是要传递一个实例对象到该方法中作为第一个实参. 我们在定义类实例方法的时候将 self 变量作为方法的第一个形参, 这样做为我们带来的好处在于, 我们通过实例对象去调用该类实例方法时, 不需要显式的传递实例对象自身给 self 形参, 这一切都交由 Python 解析器去做. 相反, 如果我们希望不需要通过实例对象就能调用类实例方法, 那么我们就显式的将实例对象传入吧.

调用非绑定方法最常间的场景就是, 我们在派生一个子类, 并且希望在子类中覆盖父类的同名方法(重载).
EXSMPLE:

In [1]: class AClass(object):
   ...:     def __init__(self, name):
   ...:         self.name = name
   ...:         

In [3]: class BClass(AClass):
   ...:     def __init__(self, age):
   ...:         AClass.__init__(self, name)
   ...:         self.age = age
   ...:         

在这个例子中, 我们在子类的构造器中调用了父类的构造器, 并且显式的传递了父类构造器所需要的 self 实参 __init__(self, name) 中, 所以我们可以通过类名结合句点标识符的方式来调用父类的实例方法 AClass.__init__(self, name) .

当然, 我们之前的博文中也介绍过这种时候我们建议通过 super()内置方法来实现.