• 完成 Python 教程。
8 面向对象编程
- 面向对象编程----Object Oriented Programming,简称OOP,是一种程序设计思想。OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数。
- 面向对象的程序设计把计算机程序视为一组对象的集合,而每个对象都可以接收其他对象发过来的消息,并处理这些消息,计算机程序的执行就是一系列消息在各个对象之间传递。
- 给对象发消息实际上就是调用对象对应的关联函数,我们称之为对象的方法(Method)。
- 类是抽象的模板,而实例是根据类创建出来的一个个具体的“对象”,每个对象都拥有相同的方法,但各自的数据可能不同。
- 创建实例的时候,可以定义一个特殊的
__init__
方法,__init__
方法的第一个参数永远是self
,表示创建的实例本身,创建实例的时候,self参数不需要传,python解释器自己会把实例变量传进去。 - 与普通的函数相比,在类中定义的函数只有一点不同,就是第一个参数永远是实例变量self,并且,调用时,不用传递该参数。除此之外,类的方法和普通函数没有什么区别,所以你仍然可以用默认参数、可变参数、关键字参数和命名关键字参数。
- 封装的一个好处是把数据和逻辑封装起来,调用很容易,但却不用知道内部实现的细节。封装的另一个好处是可以给student类增加新的方法。
- 方法就是与实例绑定的函数,与普通函数不同,方法可以直接访问实例的数据。
- 与静态语言不同,python允许对实例变量绑定任何数据,也就是说,对于两个实例变量,虽然它们都是同一个类的不同实例,但拥有的变量名称都可能不同。
- 如果要让内部属性不被外部访问,可以把属性的名称前加上两个下划线
__
- 在OOP程序设计中,当我们定义一个class的时候,可以从某个现有的class继承,新的class称为子类(Subclass),而被继承的类称为基类、父类或超类(Base class,Super class)。
- 继承有什么好处?最大的好处是子类获得了父类的全部功能。
- 继承的第二个好处就是可以对父类的方法进行覆盖,从而实现多态。
- 多态的真正威力在于调用方只管调用,不管细节。这就是著名的“开闭”原则。
- 对于静态语言(如JAVA)来说,如果需要传入Animal类型,则传入的对象必须是Animal类型或者它的子类,否则,将无法调用run()方法。对于Python这样的动态语言来说,则不一定需要传入Animal类型。我们只需要保证传入的对象有一个run()方法就可以了。
- 动态语言的“鸭子类型”,它并不要求严格的继承体系,一个对象只要“看起来像鸭子,走起路来像鸭子”,那它就可以被看做是鸭子。
- 我们来判断对象类型,使用
type()
函数。 - 对于class的继承关系来说,使用
type()
就很不方便。我们要判断class的类型,可以使用isinstance()
函数。 - 总是优先使用isinstance()判断类型,可以将指定类型及其子类“一网打尽”。
- 如果要获得一个对象的所有属性和方法,可以使用
dir()
函数 - 仅仅把属性和方法列出来是不够的,配合
getattr()
、setattr()
以及hasattr()
,我们可以直接操作一个对象的状态 - 通过内置的一系列函数,我们可以对任意一个Python对象进行剖析,拿到其内部的数据。要注意的是,只有在不知道对象信息的时候,我们才会去获取对象信息。
- 如果类本身需要绑定一个属性,可以直接在class中定义属性,这种属性就是类属性,归类所有。
- 在编写程序的时候,千万不要对实例属性和类属性使用相同的名字,因为相同名称的实例属性将屏蔽掉类属性,但是当你删除实例属性后,再使用相同的名称,访问到的将是类属性。