《8.Python面向对象编程》由会员分享,可在线阅读,更多相关《8.Python面向对象编程(45页珍藏版)》请在金锄头文库上搜索。
1、PYTHON程程序设计序设计www.python.orgPython程序设计程序设计第第8 8章章 PythonPython面向对象编程面向对象编程Python程序设计程序设计8.1 8.1 多态多态、封装与、封装与继承继承8.2 8.2 类与对象类与对象8.3 8.3 构造函数构造函数8.4 8.4 函数函数propertypropertyPython程序设计程序设计多态、封装与继承多态、封装与继承polymorphism多态指的是能够同样地对待不同类型和类的对象即无需知道对象属于哪个类就可调用其方法操作的行为将随对象所属的类而变化Python程序设计程序设计多态、封装与继承多态、封装与继承
2、abc.count(a)11,2,a.count(a)11+23sdut+edusduteduPython程序设计程序设计多态、封装与继承多态、封装与继承目的:向外部隐藏不必要的细节encapsulation可以让对象拥有自己的状态。对象的状态由对象的属性来表征。对象的方法可以修改这些属性。Python程序设计程序设计多态、封装与继承多态、封装与继承继承:一个派生类(derived class)继承基类(base class)的字段和方法。继承允许把一个派生类的对象作为一个基类对象对待。例如,一个Dog类型的对象派生自Animal类。Inheritance Python程序设计程序设计8.1
3、8.1 多态多态、封装与、封装与继承继承8.2 8.2 类与对象类与对象8.3 8.3 构造函数构造函数8.4 8.4 函数函数propertypropertyPython程序设计程序设计类与对象类与对象类(Class): 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象:通过类定义的数据结构的实例。对象包括两个数据成员(类变量和实例变量)和方法。Python程序设计程序设计类与对象类与对象自定义类Python程序设计程序设计类与对象类与对象因封装而隐藏Python没有为私有属性提供直接的支持,而是需要程序员知道在什么情况下从外部修改属性是安全的。Py
4、thon提供让方法或者属性成为私有的方式,在其名称前加两个下划线,以此类似于其他语言的标准私有化方法。Python程序设计程序设计类与对象类与对象隐藏Python程序设计程序设计类与对象类与对象隐藏Python程序设计程序设计类与对象类与对象隐藏无法禁止别人访问对象的私有方法和属性Python程序设计程序设计类与对象类与对象继承与多态对于Dog,Cat来说,Animal就是它的父类,对于Animal来说,Dog和Cat就是它的子类Python程序设计程序设计类与对象类与对象继承与多态当子类和父类都存在相同的方法时,子类覆盖了父类,在代码运行的时候,总是会调用子类的方法,体现了多态特性。Pyth
5、on程序设计程序设计类与对象类与对象isinstanceisinstance判断变量是否属于某一种类型Python程序设计程序设计类与对象类与对象issubclass判断一个类是否是另一个类的子类_base_查看类的基类Python程序设计程序设计类与对象类与对象多重继承多重继承是个功能强大的工具,但除非万不得已,尽量避免使用Python程序设计程序设计类与对象类与对象多重继承如果多个父类以不同的方式实现同一个方法(即多个同名的方法),必须在calss语句中小心排列这些父类,因为前面类的方法将覆盖后面类的方法。如class TalkCal(Talker, Calculator):pass如两个
6、父类都有talk方法,那么Talker将导致Calculator中的talk方法无法访问。Python程序设计程序设计类与对象类与对象抽象基类ABC,Abstract Base Class(抽象基类),主要定义了基本类和最基本的抽象方法,可以为子类定义共有的API,不需要具体实现。相当于是Java中的接口或者是抽象类。 抽象基类可以不实现具体的方法(当然也可以实现,只不过子类如果想调用抽象基类中定义的方法需要使用super())而是将其留给派生类实现。Python程序设计程序设计类与对象类与对象抽象基类Python程序设计程序设计类与对象类与对象抽象基类Python程序设计程序设计类与对象类与
7、对象抽象基类直接继承 直接继承抽象基类的子类就没有这么灵活,抽象基类中可以声明”抽象方法“和“抽象属性”,只有完全覆写(实现)了抽象基类中的“抽象”内容后,才能被实例化,而虚拟子类则不受此影响。Python程序设计程序设计类与对象类与对象抽象基类Python程序设计程序设计类与对象类与对象抽象基类虚拟子类 将其他的类”注册“到抽象基类下当虚拟子类(调用register方法),虚拟子类的好处是你实现的第三方子类不需要直接继承自基类,可以实现抽象基类中的部分API接口,也可以根本不实现,Python程序设计程序设计类与对象类与对象抽象基类Python程序设计程序设计8.1 8.1 多态多态、封装与
8、、封装与继承继承8.2 8.2 类与对象类与对象8.3 8.3 构造函数构造函数8.4 8.4 函数函数propertypropertyPython程序设计程序设计构造函数构造函数构造函数用于初始化类的内部状态,使用方式为_init_(self, 参数)类被实例化的时候就会执行该函数,可以把要先初始化的属性放到这个函数里面Python程序设计程序设计构造函数构造函数构造函数Python程序设计程序设计构造函数构造函数析构函数Python提供_del_方法构成析构函数当使用del 删除对象时,会调用他本身的析构函数当对象在某个作用域中调用完毕,在跳出其作用域的同时析构函数也会被调用一次,这样可以
9、用来释放内存空间鉴于无法知道准确的调用时间,建议尽可能不要使用_del_Python程序设计程序设计构造函数构造函数析构函数Python程序设计程序设计构造函数构造函数重写构造函数重写是继承机制的一个重要方面,对构造函数尤其重要。构造函数用于初始化新建对象的状态,对于大多数子类来说,除了父类的初始化代码外,还需要有自己的初始化。与重写普通方法相比,重写构造函数时,必须调用父类的构造函数,否则可能无法正确的初始化对象。Python程序设计程序设计构造函数构造函数重写构造函数Python程序设计程序设计构造函数构造函数重写构造函数Python程序设计程序设计构造函数构造函数重写构造函数调用未关联的
10、超类构造函数使用super函数Python程序设计程序设计构造函数构造函数重写构造函数调用未关联的超类构造函数Python程序设计程序设计构造函数构造函数重写构造函数使用super函数使用super函数更直观,即便有多个父类,只需调用super函数一次Python程序设计程序设计8.1 8.1 多态多态、封装与、封装与继承继承8.2 8.2 类与对象类与对象8.3 8.3 构造函数构造函数8.4 8.4 函数函数propertypropertyPython程序设计程序设计propertyproperty对新式类,将类的方法变成属性来访问可以使用property函数property(fget, fset, fdel, doc)也可以将property函数当作装饰器使用propertyPython程序设计程序设计propertypropertyproperty函数Python程序设计程序设计propertypropertyPython程序设计程序设计propertypropertypropertyPython程序设计程序设计propertypropertyproperty看到property,在对实例属性操作的时候,就知道该属性很可能不是直接暴露的,而是通过getter和setter方法来实现的。只定义getter方法,不定义setter方法就是一个只读属性谢谢大家