Python编程技术6.Python类与对象陈建文华中科技大学电子与信息工程系chenjw@hust.edu.cn2014-04-102014-04-106.Python类与对象26.1类与对象定义6.2类与对象特点6.3类的构造函数6.4类与对象检查6.5面向对象模型6.6对象高级主题6.Python类与对象2014-04-106.Python类与对象36.1类与对象定义面向过程与面向对象面向过程编程:根据操作数据的函数或语句块来设计程序的。面向对象编程:数据和功能结合起来,用称为对象的东西包裹起来组织程序的方法;在大多数时候你可以使用面向过程编程,但是有些时候当需要编写大型程序或是寻求一个更加合适的解决方案的时候,就需要面向对象的编程,Python既可以提供面向过程的编程,也可以面向对象的编程,归根到底,Python语言是面向对象的编程语言。2014-04-106.Python类与对象4类与对象示例classBird():def__init__(self):self.hungry=Truedefeat(self):ifself.hungry:print('Aaaah...')self.hungry=Falseelse:print('No,thanks!')b1=Bird()b1.eat()Aaaah...b1.eat()No,thanks!b1.eat()No,thanks!b1.hungryFalseb1.hungryFalse2014-04-106.Python类与对象5类和对象是面向对象编程的两个主要方面,类创建一个新类型,而对象是这个类的实例。这类似于上面一个类Bird(),而b1是类Bird的一个实例,也就是类的一个对象(实例)。类的组成元素:关键字(类):class类的名字:Bird构造函数:__init__(self)类的方法:eat(self)(b1.eat())类的特性:hungry(b1.hungry)2014-04-106.Python类与对象6类与对象格式类的组成:classClass_Name(SuperClass,…):class_variable=valuedef__init__(self,argv):statementdefclass_func(self,argv):statement关键字(类):class类的名字:Class_name构造函数:__init__(self,argv)类的方法:class_func(self,argv)类的特性:class_variable2014-04-106.Python类与对象7对象定义class_object_1=Class_Name()class_object_2=Class_Name()class_object_1.class_variableclass_object_2.class_variableclass_object_1.class_func(argv)class_object_2.class_func(argv)对象定义:class_object_1=Class_Name()对象特性:class_object_1.class_variable对象方法:class_object_1.class_func(argv)2014-04-106.Python类与对象86.2类与对象特点类与对象特性对象可以使用普通的属于对象的变量存储数据,属于一个对象或类的变量被称为特性;对象也可以使用属于类的函数具有的功能;这样的函数被称为类的方法。这些术语帮助我们把它们与孤立的函数和变量区分开来;特性和方法可以合称为类的属性。特性有两种类型:属于每个实例/类的对象或者属于类本身,它们分别被称为实例变量和类变量。类使用class关键字创建,类的特性和方法被列在一个缩进块中。2014-04-106.Python类与对象9与类和对象的名称空间绑定的普通变量,即这些名称只在这些类与对象的前提下有效。类名.类变量(使用对象名.类变量也可访问);对象名.对象变量。命名空间定义的位置:类特性:紧跟在类定义之后;对象特性:在__init__中使用self.xxx=定义。例子:classvar():value=1instance1=var()var.valueinstance1.value2014-04-106.Python类与对象10类与对象方法类的方法与普通的函数只有一个特别的区别:类的方法必须有一个额外的第一个参数名称self,但是在调用这个方法的时候你不必为这个参数赋值,Python会提供这个值,这个特别的变量指的是对象本身,按照惯例它的名称就是在类定义中常见的self这个变量名。可以是任意一个变量名,但最好遵循通用的规则;Self这个变量名具有一定的魔法,在具体的对象中它有特定的意义。2014-04-106.Python类与对象11Self参数的工作原理:假如你有一个类称为MyClass和这个类的一个实例MyObject。当你调用这个对象的方法MyObject.method(arg1,arg2)的时候,这会由Python自动转为MyClass.method(MyObject,arg1,arg2),这就是self的使用原理。如果你有一个不需要参数的方法,你还是得给这个方法定义一个带有self参数。类与对象方法的使用:调用方法同普通函数一致,忽略self参数。对象名.方法名(参数…)2014-04-106.Python类与对象12classBird:def__init__(self):self.hungry=Truedefeat(self):ifself.hungry:print('Aaaah...')self.hungry=Falseelse:print('No,thanks!')b=Bird()b.hungryTrueb.eat()Aaaah...b.eat()No,thanks!b.eat()No,thanks!2014-04-106.Python类与对象13类与对象的魔法:(详见对象高级主题)__init__构造函数;__del__析构函数;__len__,__getitem__,__setitem__,__delitem__这是系列映射规则;……__privatename私有类的变量名;@decorators装饰器;__iter__迭代器;……2014-04-106.Python类与对象14类与对象多态Polymorphism:术语多态来自于希腊语,多态意味着就算不知道变量所引用的对象类型是什么,还是能对它进行操作,而且它也能根据(或者类)对象的类型的不同而表现出不同的行为。例如:classvar():value=1instamce1=var()var.value=‘Python’instance1.value=55defadd1(x,y):returnx+yx=1,y=23x=“spam”,y=‘Python’add1(x,y)2014-04-106.Python类与对象15类与对象封装Encapsulation:封装是对外部隐藏对象内部细节的原则,看起来有点象多态,但封装并不等于多态;多态可以让用户对于不知道是什么类或者对象类型的对象进行方法调用;而封装是可以不用关心对象是如何构建的而直接进行使用。例如:classvar():value=1instance1=var()instance2=var()instance1.value=‘Python’instance2.value=552014-04-106.Python类与对象16类与对象继承Inheritance:以普通类为基础建立专门的类对象;如果已经有一个基类,想再建立一个新类,新类中要添加几种新方法,而又要用原来基类的一些方法,这个时候新类就要继承基类的方法,而又有新的方法,这就是继承;继承的方法就是在新类定义中添加一个基类作为参数。例如:classSongBird(Bird):def__init__(self):self.sound=‘Squawk’defsing(self):print(self.sound)2014-04-106.Python类与对象176.3类的构造函数类的构造函数定义类的构造函数的形式为:def__init__(self):superclass.__init__(self)#未绑定超类super(subclass,self).__init__()#调用super()statement类的构造函数与其它普通方法不同的地方在于,当一个对象被创建后,会立即调用构造方法,就有点类似于程序中的init的初始化方法。如果要继承构造方法,可以调用未绑定的超类构造方法,也可以用super函数调用超类构造函数。2014-04-106.Python类与对象18类的构造函数继承classBird:def__init__(self):self.hungry=Truedefeat(self):ifself.hungry:print('Aaaah...')self.hungry=Falseelse:print('No,thanks!')classSongBird(Bird):def__init__(self):super(SongBird,self).__init__()self.sound=‘Squawk’defsing(self):print(self.sound)2014-04-106.Python类与对象196.4类与对象的检查Callable(object):检查对象是否可调用。hasattr(object,method):检查给定的对象是否有指定的属性。getattr(object,name):返回给定对象中所指定的特征的值,可选择给定默认值。issubclass(subclass,superclass):检查subclass是否是superclass的子类(每个类都是自身的子类)。isinstance(object,class):检查给定的对象object是否是给定的class类的实例。2014-04-106.Python类与对象206.5面向对象模型面向对象模型建立草图:写下问题的描述(程序要做什么?)把所有动词、名词、形容词加下划线;对于所有名词,用作可能的类;对于所有动词,用作可能的方法;对于所有形容词,用作可能的特性;对所有方法与特性分配到类。建立类与实例模型:写下一系列使用实例;一步一步考虑每个使用实例,保证模型包含所有需要的东西。2014-04-106.Python类与对象216.6对象高级主题构造方法构造方法不同于其它方法之处在于:当一个对象被创建时,会立即调用构造方法,而且可以继承。classBird:def__init__(self):self.hungry=Truedefeat(self):ifself.hungry:print('Aaaah...')self.hungry=Falseelse:print('No,thanks!')classSongBird(Bird):def__init__(self):super(SongBird,self).__init__()self.sound='Squawk'defsing(self):print(self.sound)2014-04-106.Python类与对象22成员访问利用__getitem__,__setitem__,等魔法可以实现简单序列。defcheckIndex(key):ifnotisinstance(key,(int,float)):raiseTypeErrorifkey0:raiseIndexErrorclassAri