您好,欢迎访问三七文档
当前位置:首页 > IT计算机/网络 > 电子商务 > python实用教程-第八章-类与对象
第八章类与对象•Python支持创建自己的对象,Python从设计之初就是一门面向对象语言,它提供了一些语言特性支持面向对象编程。•创建对象是Python的核心概念,本章将介绍如何创建对象,以及多态、封装、方法和继承等概念。•Python快乐学习班的同学结束函数乐高积木厅的创意学习后,导游带领他们来到对象动物园。在对象动物园,将为同学们呈现各种动物对象,同学们将在这里了解各种动物所属的类别,各种动物所拥有的技能,以及它们的技能继承自哪里等知识点。现在跟随Python快乐学习班的同学一起进入对象动物园观摩吧!8.1理解面向对象8.1.1面向对象编程•Python是一门面向对象编程语言,对面向对象语言编码的过程就叫做面向对象编程。•面向对象编程——ObjectOrientedProgramming,简称OOP,是一种程序设计思想。OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数。•面向对象的程序设计把计算机程序视为一组对象的集合,每个对象都可以接收其他对象发过来的消息,并处理这些消息,计算机程序的执行就是一系列消息在各个对象之间传递。•在Python中,所有数据类型都被视为对象,也可以自定义对象。自定义的对象数据类型就是面向对象中的类(Class)的概念。8.1.2面向对象术语简介•类(Class):用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。•类变量(或属性):类变量在整个实例化的对象中是公用的。类变量定义在类中且在方法之外。类变量通常不作为实例变量使用。类变量也称作属性。•数据成员:类变量或者实例变量用于处理类及其实例对象的相关的数据。•方法重写:如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重写。•实例变量:定义在方法中的变量,只作用于当前实例的类。•多态(Polymorphism):对不同类的对象使用同样的操作。•封装(Encapsulation):对外部世界隐藏对象的工作细节。•继承(Inheritance):即一个派生类(derivedclass)继承基类(baseclass)的字段和方法。继承也允许把一个派生类的对象作为一个基类对象对待。以普通的类为基础建立专门的类对象。•实例化(Instance):创建一个类的实例,类的具体对象。•方法:类中定义的函数。•对象:通过类定义的数据结构实例。对象包括两个数据成员(类变量和实例变量)和方法。•Python中的类提供了面向对象编程的所有基本功能:类的继承机制允许多个基类,派生类可以覆盖基类中的任何方法,方法中可以调用基类中的同名方法。•对象可以包含任意数量和类型的数据。8.2类的定义与使用8.2.1类的定义•类定义的语法格式如下:•classClassName(object):•statement-1•.•statement-N•Python中定义类使用class关键字,class后面紧跟类名。•示例如下(my_class.py):•classMyClass(object):•i=123•deff(self):•return'helloworld'•由代码可以看到,这里定义了一个名为MyClass的类。•在Python中,类名一般由以大写字母开头的单词命名,并且若是由多个单词组成的类名,那各个单词的首字母都大写。类名后面紧接着是(object),object表示该类是从哪个类继承的。通常,如果没有合适的继承类,就使用object类,这是所有类最终都会继承的类。类包含属性(相当于函数中的语句)和方法(类中的方法大体可以理解成第7章所学的函数)。•在类中定义的方法的形式和函数差不多,但不称为函数,而称为方法。因为方法需要靠类对象去调用,而函数不需要。8.2.2类的使用•classMyClass(object):•i=123•deff(self):•return'helloworld'••use_class=MyClass()•print('调用类的属性:',use_class.i)•print('调用类的方法:',use_class.f())•类的使用比函数调用多了几个操作,调用需要执行如下操作:•use_class=MyClass()•这步叫做类的实例化,即创建一个类的实例,此处得到的use_class这个变量称为类的具体对象。•再看后面两行的调用:•print(f'调用类的属性:{use_class.i}')•print(f'调用类的方法:{use_class.f()}')•这里第一行后面use_class.i部分的作用是调用类的属性,也就是前面所说的类变量。第二行后面use_class.f()部分的作用是调用类的方法。•在类中定义方法的要求:在类中定义方法时,第一个参数必须是self。除第一个参数之外,类的方法和普通函数没什么区别,如可以用默认参数、可变参数、关键字参数和命名关键字参数等。•在类中调用方法的要求:要调用一个方法,在实例变量上直接调用即可。除了self不用传递,其他参数正常传入。•类对象支持两种操作,属性引用和实例化。实例化方式上面已经介绍过,属性引用的标准语法格式如下:•obj.name•语法中,obj代表类对象,name代表属性。8.3深入类•本节将深入介绍类的相关内容,如类的构造方法和访问权限。8.3.1类的构造方法•对前面的示例做一些改动,改动后代码如下(my_calss_search.py):•classMyClass(object):•i=123•def__init__(self,name):•self.name=name••deff(self):•return'hello,'+self.name••use_class=MyClass('xiaomeng')•print('调用类的属性:',use_class.i)•print('调用类的方法:',use_class.f())•实例化MyClass这个类时,调用了__init__()这个方法。在Python中,__init__()方法是一个特殊的方法,当对象实例化时会被调用,__init__()的意思是初始化,是initialization的简写。这个方法的书写方式是:先两个下划线,后面接着是init,再接着两个下划线。这个方法也叫构造方法。在定义类时,若不显式定义一个__init__()方法,则程序默认调用一个无参的__init__()方法。•在Python中,定义类时,若没有定义构造方法(__init__()方法),在类的实例化时,系统会调用默认的构造方法。另外,__init__()方法可以有参数,参数通过__init__()传递到类的实例化操作上。•一个类中可用定义多个构造方法,但类实例化时只实例化其中位于最后的一个构造方法,也即后面的构造方法会覆盖前面的构造方法,并且实例化时需要根据最后一个构造方法的形式进行实例化。•建议一个类中只定义一个构造函数。8.3.2类的访问权限•在类内部,可以有属性和方法,而外部代码可以通过直接调用实例变量的方法来操作数据,这样,就隐藏了内部的复杂逻辑。•要让内部属性不被外部访问,可以在属性的名称前加上两个下划线__,在Python中,实例的变量名如果以__开头,就变成了一个私有变量(private),只有内部可以访问,外部不能访问。•在Python中,可以给类增加get_attrs这样的方法来获取类中的私有变量。•在Python中,可以再给类增加set_attrs这样的方法来修改类中的私有变量。•在Python中,通过定义私有变量和定义对应的set方法,可以帮助我们做参数检查,避免传入无效的参数。•类还有私有方法。类的私有方法也是以两个下划线开头,声明该方法为私有方法,且不能在类的外使用。8.4继承•继承的语法格式如下:•classDerivedClassName(BaseClassName):•statement-1•.•.•statement-N•面向对象的编程带来的主要好处之一是代码的重用,实现这种重用的方法之一是通过继承机制。继承完全可以理解成类之间的类型和子类型关系。•在面向对象程序设计中,当我们定义一个class的时候,可以从某个现有的class继承,定义的新的class称为子类(Subclass),而被继承的class称为基类、父类或超类(Baseclass、Superclass)。•继承语法class子类名(基类名):基类名写在括号里,基本类是在类定义的时候,在元组之中指明的。•在python中继承中的一些特点:•(1)在继承中,基类的构造方法(__init__()方法)不会被自动调用,它需要在其子类的构造方法中专门调用。•(2)在调用基类的方法时,需要加上基类的类名前缀,且需要带上self参数变量。区别于在类中调用普通函数时并不需要带上self参数。•(3)Python总是首先查找对应类型的方法,如果不能在子类中找到对应的方法,它才到基类中逐个查找。•继承有什么好处?•最大的好处是子类获得了父类的全部非私有的功能。•classAnimal(object):•defrun(self):•print('Animalisrunning...')•定义类:•classDog(Animal):•pass••classCat(Animal):•pass•dog=Dog()•dog.run()••cat=Cat()•cat.run()8.5多重继承•Python还支持多重继承。多重继承的语法格式如下:•classDerivedClassName(Base1,Base2,Base3):•statement-1•.•statement-N•可以看到,多重继承就是在定义类时,在类名后面的圆括号中添加多个基类(父类或超类),各个基类之间使用逗号分隔。•需要注意圆括号中父类的顺序,若父类中有相同的方法名,在子类使用时未指定,Python会从左到右进行搜索。即若某个方法在子类中没有定义,则子类从左到右查找各个父类中是否包含这个方法。•通过类的多重继承,一个子类就可以继承多个父类,并从多个父类中取得所有非私有方法。8.6多态•使用继承,可以重复使用代码。但对于继承中的示例,无论是Dog类还是Cat类,调用父类的run()方法时显示的都是Animalisrunning...。•对Dog类和Cat类做如下改进(完整代码见animal_3.py):•classDog(Animal):•defrun(self):•print('Dogisrunning...')••classCat(Animal):•defrun(self):•print('Catisrunning...')•执行如下语句:•dog=Dog()•print('实例化Dog类')•dog.run()••cat=Cat()•print('实例化Cat类')•cat.run()•执行结果如下:•实例化Dog类•Dogisrunning...•实例化Cat类•Catisrunning...•由执行结果看到,分别得到了Dog和Cat各自的running结果。•当子类和父类都存在相同的run()方法时,子类的run()方法会覆盖了父类的run()方法,在代码运行的时候,总是会调用子类的run()方法。我们称这个为:多态。•多态这个术语来自希腊语,意思是有多种形式。多态意味着就算不知道变量所引用的对象类型是什么,还是能对对象进行操作,而多态也会根据对象(或类)的不同而表现出不同的行为。例如我们上面定义的Animal类,在类中定义了run方法,Dog和Cat类分别继承Animal类,并且分别定义了自己的run方法,最后Dog和Cat调用run方法时,调用的是自己的定义的run方法。•多态的好处就是,当我们需要传入Dog、Cat等对象时,我们只需要接收Animal类型就可以了,因为Dog、Cat等都是Animal类型,然后,按照Animal类型进行
本文标题:python实用教程-第八章-类与对象
链接地址:https://www.777doc.com/doc-7176453 .html