Python中类的定义与使用用知识的浪花去推动思考的风帆,用智慧的火星去点燃思想的火花,用浪漫的激情去创造美好的生活,用科学的力量去强劲腾飞的翅膀!翟哥复习Python的特点本次主要知识点一面向对象程序设计基础二定义和使用类三类的继承和多态四思考题五总结一面向对象程序设计基础1.3给大家介绍对象爬跑咬人吃东西睡觉绿色四条腿10kg有外壳大嘴巴对象=属性+方法1.4面向对象程序设计中的基本概念(1)对象(Object):面向对象程序设计思想可以将一组数据和与这组数据有关操作组装在一起,形成一个实体,这个实体就是对象。(2)类(class):具有相同或相似性质的对象的抽象就是类。因此,对象的抽象是类,类的具体化就是对象。例如,如果人类是一个类,则一个具体的人就是一个对象。(3)封装:将数据和操作捆绑在一起,定义一个新类的过程就是封装。(4)继承:类之间的关系,在这种关系中,一个类共享了一个或多个其他类定义的结构和行为。继承描述了类之间的关系。子类可以对基类的行为进行扩展、覆盖、重定义。如果人类是一个类,则可以定义一个子类“男人”。“男人”可以继承人类的属性(例如姓名、身高、年龄等)和方法(即动作。例如,吃饭和走路),在子类中就无需重复定义了。从同一个类中继承得到的子类也具有多态性,即相同的函数名在不同子类中有不同的实现。就如同子女会从父母那里继承到人类共有的特性,而子女也具有自己的特性。(5)方法:也称为成员函数,是指对象上的操作,作为类声明的一部分来定义。方法定义了可以对一个对象可以执行的操作。(6)构造函数:一种成员函数,来在创建对象时初始化对象。构造函数一般与它所属的类完全同名。二定义和使用类2.1声明类2.2类方法2.3使用instance()函数判断对象类型2.1声明类在Python中,可以使用class关键字来声明一个类,其基本语法如下:class类名:成员变量成员函数同样,Python使用缩进标识类的定义代码。【例2-1】classPerson:defSayHello(self):print(Hello!)2.1.1self可以看到,在成员函数SayHello()中有一个参数self。这也是类的成员函数(方法)与普通函数的主要区别。类的成员函数必须有一个参数self,而且位于参数列表的开头。self就代表类的实例(对象)自身,可以使用self引用类的属性和成员函数。在后面部分还会结合实际应用介绍self的使用方法。2.1.2定义类的对象对象是类的实例。如果人类是一个类的话,那么某个具体的人就是一个对象。只有定义了具体的对象,才能使用类。Python创建对象的方法如下:对象名=类名()例如,下面的代码定义了一个类Person的对象p:p=Person()【例2-2】classPerson:defSayHello(self):print(Hello!);p=Person()p.SayHello()运行结果如下:Hello!2.1.3成员变量【例2-3】定义一个字符串类MyString,定义成员变量str,并同时对其赋初始值。classMyString:str=MyStringdefoutput(self):print(self.str)s=MyString()s.output()2.1.4Python使用下划线作为变量前缀和后缀来指定特殊变量,规则如下:__xxx__表示系统定义名字。__xxx表示类中的私有变量名。类的成员变量可以分为两种情况,一种是公有变量,一种是私有变量。公有变量可以在类的外部访问,它是类与用户之间交流的接口。用户可以通过公有变量向类中传递数据,也可以通过公有变量获取类中的数据。在类的外部无法访问私有变量,从而保证类的设计思想和内部结构并不完全对外公开。在Python中除了__xxx格式的成员变量外,其他的成员变量都是公有变量。2.1.5构造函数构造函数是类的一个特殊函数,它拥有一个固定的名称,即__init__(注意,函数名是以两个下划线开头和两个下划线结束的).当创建类的对象实例时系统会自动调用构造函数,通过构造函数对类进行初始化操作。【例2-4】classMyString:def__init__(self):self.str=MyStringdefoutput(self):print(self.str);s=MyString()s.output()【例2-5】classUserInfo:def__init__(self,name,pwd):self.username=nameself._pwd=pwddefoutput(self):print(用户:+self.username+\n密码:+self._pwd);u=UserInfo(admin,123456)u.output()2.2类方法类方法是Python的一个新概念。类方法具有如下特性:(1)与静态方法一样,类方法可以使用类名调用类方法。(2)与静态方法一样,类成员方法也无法访问实例变量,但可以访问类的静态变量。(3)类方法需传入代表本类的cls参数。使用装饰符@staticmethod定义类方法class类名:@classmethoddef类方法名(cls):方法体2.3使用instance()函数判断对象类型使用instance()函数可以用来检测一个给定的对象是否属于(继承于)某个类或类型,如果是则返回True;否则返回False。其使用方法如下:isinstance(对象名,类名或类型名)如果对象名属于指定的类名或类型名,则instance()函数返回True,否则返回False。三类的继承和多态继承和多态是面向对象程序设计思想的重要机制。类可以继承其他类的内容,包括成员变量和成员函数。而从同一个类中继承得到的子类也具有多态性,即相同的函数名在不同子类中有不同的实现。就如同子女会从父母那里继承到人类共有的特性,而子女也具有自己的特性。在OOP程序设计中,当我们定义一个class的时候,可以从某个现有的class继承,新的class称为子类(Subclass),而被继承的class称为基类、父类或超类(Baseclass、Superclass)。3.1继承classAnimal(object):defrun(self):print('Animalisrunning...')classDog(Animal):passclassCat(Animal):passdog=Dog()dog.run()cat=Cat()cat.run()运行结果如下:Animalisrunning...Animalisrunning...继承有什么好处?最大的好处是子类获得了父类的全部功能。由于Animial实现了run()方法,因此,Dog和Cat作为它的子类,什么事也没干,就自动拥有了run()方法。3.2多态当我们定义一个class的时候,我们实际上就定义了一种数据类型。我们定义的数据类型和Python自带的数据类型,比如str、list、dict没什么两样。举例如下:a=list()#a是list类型b=Animal()#b是Animal类型c=Dog()#c是Dog类型isinstance(a,list)Trueisinstance(b,Animal)Trueisinstance(c,Dog)True看来a、b、c确实对应着list、Animal、Dog这3种类型。但是等等,试试:isinstance(c,Animal)True看来c不仅仅是Dog,c还是Animal!四思考题1.小明和小强都是张老师的学生,张老师的生日是M月N日,2人都不知道。张老师的生日是下列10组中的一天,张老师把M值告诉了小明,把N值告诉了小强,张老师问他们知道他的生日是那一天吗?3月4日3月5日3月8日6月4日6月7日9月1日9月5日12月1日12月2日12月8日小明说:如果我不知道的话,小强肯定也不知道。小强说:本来我也不知道,但是现在我知道了。小明说:哦,那我也知道了。请根据以上对话推断出张老师的生日是哪一天?请说明理由。五总结1.思考学到了哪些东西?2.条理化,清晰化3.中间遇到了哪些问题,怎么解决和处理4.主次分明,舍得舍得5.工具和方法