Python学习笔记第九章类一、创建和使用类二、使用类和实例三、继承四、导入模块五、Python标准库六、注 一、创建和使用类 1、类和函数的区别 类(class):类是面向你对象的,class可以保存一此属性的状态,同时也起到模板的作用,把一些通用的东西写进类定义中,也就是在’init’中。class有点像是将多个函数进行功能性封装 函数:函数更像是面向过程编程,更易理解,但是当系统较大时,重复性就会增多。 使用className()来创建一个Name类,类中包含许多方法(函数),根据类来创建实例XingMingName(),实例可以用句点表示法调用类中的方法。 一个类包含了一系列实例的通性,众多根据类创建的实例可以使用句点表示法调用类中的方法。 2、创建Dog类classDog():definit(self,name,age):self。namenameself。ageagedefsit(self):print(self。name。title()isnowsitting。)defrollover(self):print(self。name。title()rolledover!)mydogDog(willie,6)print(Mydogsnameismydog。name。title()。)print(Mydogisstr(mydog。age)yearsold。)mydog。sit()mydog。rollover()输出结果为:MydogsnameisWillie。Mydogis6yearsold。Willieisnowsitting。Willierolledover!在Python中,首字母大写的名称指的是类,因为要从空白创建这个类,所以类定义中的括号是空的。init()是类中的默认方法,每次根据类创建实例时,Python都会自动运行它。形参self必不可少,Python调用init()方法来创建实例时,将自动传入实参self。每个与类相关联的方法调用都自动传递实参self,它是一个指向实例本身的引用,让实例能够访问类中的属性和方法。创建Dog实例时,Python将diaoyongDog类的方法init(),通过实参向Dog()传递名字和年龄;self会自动传递,因此我们不需要传递它。每当我们根据Dog类创建实例时,都只需给最后两个形参(name和age)提供值。以self为前缀的变量都可供类中的所有方法使用,可以通过类的任何实例来访问这些变量。像self。name、self。age这样可以通过实例访问的变量称为属性。属性参数传递给init,使用self。属性来给实例赋予属性。访问属性:mydog。name,Python先找到实例mydog,再查找与这个实例相关联的属性。调用方法:mydog。sit()。创建实例后,以实例名替代self,如mydog。name相当于self。name。classPeople():definit(self,name,age,weight):self。namenameself。ageageself。weightweightdefwalk(self):print(self。name。title()isnowwalkingontheroad。)defdie(self):print(self。name。title()sweightisstr(self。weight)whenhewassenttothecrematorium。)zhangPeople(ZhangSan,18,200)print(zhang。name。title()isstr(zhang。age)yearsold。)zhang。walk()zhang。die()输出结果为:ZhangSanis18yearsold。ZhangSanisnowwalkingontheroad。ZhangSansweightis200whenhewassenttothecrematorium。二、使用类和实例 1、Car类classCar():definit(self,make,model,year):self。makemakeself。modelmodelself。yearyeardefgetdescriptivename(self):longnamestr(self。year)self。makeself。model。returnlongname。title()mynewcarCar(audi,a4,2016)print(mynewcar。getdescriptivename())输出结果为:2016AudiA4。 2、给属性指定默认值直接在方法中创建一个变量,并赋予初始默认值classCar():definit(self,make,model,year):self。makemakeself。modelmodelself。yearyearself。odometerreading0赋予默认值0defgetdescriptivename(self):longnamestr(self。year)self。makeself。model。returnlongname。title()defreadodometer(self):print(Thiscarhasstr(self。odometerreading)milesonit。)mynewcarCar(audi,a4,2016)print(mynewcar。getdescriptivename())mynewcar。readodometer()输出结果为:2016AudiA4。Thiscarhas0milesonit。也可像给形参赋予默认值一样:(更易理解)classCar():definit(self,make,model,year,odometerreading0):self。makemakeself。modelmodelself。yearyearself。odometerreadingodometerreadingdefgetdescriptivename(self):longnamestr(self。year)self。makeself。model。returnlongname。title()defreadodometer(self):print(Thiscarhasstr(self。odometerreading)milesonit。)mynewcarCar(audi,a4,2016)print(mynewcar。getdescriptivename())mynewcar。readodometer()输出结果:2016AudiA4。Thiscarhas0milesonit。 3、直接修改属性的值可在类外直接对该变量进行赋值,此时Python会使用新赋予的值而非默认值classCar():definit(self,make,model,year):self。makemakeself。modelmodelself。yearyearself。odometerreading0赋予默认值0defgetdescriptivename(self):longnamestr(self。year)self。makeself。model。returnlongname。title()defreadodometer(self):print(Thiscarhasstr(self。odometerreading)milesonit。)mynewcarCar(audi,a4,2016)mynewcar。odometerreading23print(mynewcar。getdescriptivename())mynewcar。readodometer()输出结果为:2016AudiA4。Thiscarhas23milesonit。也可在定义实例时直接传入实参classCar():definit(self,make,model,year,odometerreading0):self。makemakeself。modelmodelself。yearyearself。odometerreadingodometerreadingdefgetdescriptivename(self):longnamestr(self。year)self。makeself。model。returnlongname。title()defreadodometer(self):print(Thiscarhasstr(self。odometerreading)milesonit。)mynewcarCar(audi,a4,2016,23)print(mynewcar。getdescriptivename())mynewcar。readodometer()输出结果为:2016AudiA4。Thiscarhas23milesonit。通过方法修改属性的值classCar():definit(self,make,model,year):self。makemakeself。modelmodelself。yearyearself。odometerreading10赋予默认值10defgetdescriptivename(self):longnamestr(self。year)self。makeself。model。returnlongname。title()defreadodometer(self):print(Thiscarhasstr(self。odometerreading)milesonit。)defupdateodometer(self,mileage):ifmileageself。odometerreading:self。odometerreadingmileageelse:print(Youcantrollbackanodometer!)mynewcarCar(audi,a4,2016)mynewcar。updateodometer(5)print(mynewcar。getdescriptivename())mynewcar。readodometer()输出结果为:Youcantrollbackanodometer!2016AudiA4。Thiscarhas10milesonit。通过方法对属性的值进行递增classCar():definit(self,make,model,year):self。makemakeself。modelmodelself。yearyearself。odometerreading10赋予默认值10defgetdescriptivename(self):longnamestr(self。year)self。makeself。model。returnlongname。title()defreadodometer(self):print(Thiscarhasstr(self。odometerreading)milesonit。)defupdateodometer(self,mileage):ifmileageself。odometerreading:self。odometerreadingmileageelse:print(Youcantrollbackanodometer!)defincrementodometer(self,miles):ifmiles0:self。odometerreadingmileselse:print(Youcantrollbackanodometer!)myusedcarCar(audi,a4,2016)print(myusedcar。getdescriptivename())myusedcar。updateodometer(23500)myusedcar。readodometer()myusedcar。incrementodometer(100)myusedcar。readodometer()输出结果为:2016AudiA4。Thiscarhas23500milesonit。Thiscarhas23600milesonit。三、继承编写类时,并非总要从空白开始,若要编写的类时另一个线现成类的特殊版本,可使用继承。一个类继承另一个类时,它将自动获得另一个类的所有属性和方法,原有的类称为父类,而新类称为子类。子类继承了其父类的所有属性和方法,同时还可以定义自己的属性和方法。继承:类括号非空白,使用super()函数关联父子类。 1、子类的方法init()创建子类的实例时,Python首先需要完成的任务是给父类的所有属性赋值。classCar():definit(self,make,model,year):self。makemakeself。modelmodelself。yearyearself。odometerreading10赋予默认值10defgetdescriptivename(self):longnamestr(self。year)self。makeself。model。returnlongname。title()defreadodometer(self):print(Thiscarhasstr(self。odometerreading)milesonit。)defupdateodometer(self,mileage):ifmileageself。odometerreading:self。odometerreadingmileageelse:print(Youcantrollbackanodometer!)defincrementodometer(self,miles):ifmiles0:self。odometerreadingmileselse:print(Youcantrollbackanodometer!)classElectricCar(Car):definit(self,make,model,year):super()。init(make,model,year)myteslaElectricCar(tesla,models,2016)print(mytesla。getdescriptivename())输出结果为:2016TeslaModelS。创建子类时,父类必须包含在当前文件中,且位于子类前面。定义子类时,必须在括号内指定父类的名称:ElectricCar(Car)。super()是一个特殊函数,帮助Python将父类与子类关联起来。super()。init(make,model,year)这行代码让Python调用ElectricCar的父类的方法init(),让ElectricCar实例包含父类的所有属性,父类也成为超类(superclass)。 2、给子类定义属性和方法让一个类继承另一类后,可添加区分子类和父类所需的新属性和方法。classCar():definit(self,make,model,year):self。makemakeself。modelmodelself。yearyearself。odometerreading10赋予默认值10defgetdescriptivename(self):longnamestr(self。year)self。makeself。model。returnlongname。title()defreadodometer(self):print(Thiscarhasstr(self。odometerreading)milesonit。)defupdateodometer(self,mileage):ifmileageself。odometerreading:self。odometerreadingmileageelse:print(Youcantrollbackanodometer!)defincrementodometer(self,miles):ifmiles0:self。odometerreadingmileselse:print(Youcantrollbackanodometer!)classElectricCar(Car):definit(self,make,model,year):super()。init(make,model,year)self。batterysize70defdescribebattery(self):print(Thiscarhasastr(self。batterysize)kwhbattery。)myteslaElectricCar(tesla,models,2016)print(mytesla。getdescriptivename())mytesla。describebattery()输出结果为:2016TeslaModelS。Thiscarhasa70kwhbattery。 3、重写父类的方法对于父类的方法,只要它不符合子类模拟的实物的行为,都可对其进行重写。可在子类中定义一个与要重写的父类方法同名的方法,这样Python将不会考虑这个父类方法,而只关注在子类中定义的相应方法。classCar():definit(self,make,model,year):self。makemakeself。modelmodelself。yearyearself。odometerreading10赋予默认值10defgetdescriptivename(self):longnamestr(self。year)self。makeself。model。returnlongname。title()defreadodometer(self):print(Thiscarhasstr(self。odometerreading)milesonit。)defupdateodometer(self,mileage):ifmileageself。odometerreading:self。odometerreadingmileageelse:print(Youcantrollbackanodometer!)defincrementodometer(self,miles):ifmiles0:self。odometerreadingmileselse:print(Youcantrollbackanodometer!)deffillgastank(self):print(Thiscardoesntneedagastank!)classElectricCar(Car):definit(self,make,model,year):super()。init(make,model,year)self。batterysize70defdescribebattery(self):print(Thiscarhasastr(self。batterysize)kwhbattery。)deffillgastank(self):print(Thiscardoesntneedagastank!)myteslaElectricCar(tesla,models,2016)print(mytesla。getdescriptivename())mytesla。describebattery()mytesla。fillgastank()输出结果为:2016TeslaModelS。Thiscarhasa70kwhbattery。Thiscardoesntneedagastank! 4、将实例用作属性将一个大型类拆分成多个协同工作的小类,并将这些小类的实例用作其他类的一个属性。classCar():definit(self,make,model,year):self。makemakeself。modelmodelself。yearyearself。odometerreading10赋予默认值10defgetdescriptivename(self):longnamestr(self。year)self。makeself。model。returnlongname。title()defreadodometer(self):print(Thiscarhasstr(self。odometerreading)milesonit。)defupdateodometer(self,mileage):ifmileageself。odometerreading:self。odometerreadingmileageelse:print(Youcantrollbackanodometer!)defincrementodometer(self,miles):ifmiles0:self。odometerreadingmileselse:print(Youcantrollbackanodometer!)deffillgastank(self):print(Thiscardoesntneedagastank!)classBattery():definit(self,batterysize70):self。batterysizebatterysizedefdescribebattery(self):print(Thiscarhasastr(self。batterysize)kwhbattery。)classElectricCar(Car):definit(self,make,model,year):super()。init(make,model,year)self。batteryBattery()deffillgastank(self):print(Thiscardoesntneedagastank!)myteslaElectricCar(tesla,models,2016)print(mytesla。getdescriptivename())mytesla。fillgastank()mytesla。battery。describebattery()输出结果为:2016TeslaModelS。Thiscardoesntneedagastank!Thiscarhasa70kwhbattery。在其他类中使用实例作为属性:self。类,然后再定义实例时:name。类。function即可。slef。battery让Python创建一个新的Battery实例(由于没有指定尺寸,因此为默认值70),并将该实例存储在属性self。battery中。每当方法init()被调用时,都将执行该操作;因此现在每个ElectricCar实例都包含一个自动创建的Battery实例。mytesla。battery。describebattery()让Python在实例mytesla中查找属性battery,并对存储在该属性中的Battery实例调用方法describebattery()。 5、根据电池容量修改续航里程classCar():definit(self,make,model,year):self。makemakeself。modelmodelself。yearyearself。odometerreading10赋予默认值10defgetdescriptivename(self):longnamestr(self。year)self。makeself。model。returnlongname。title()defreadodometer(self):print(Thiscarhasstr(self。odometerreading)milesonit。)defupdateodometer(self,mileage):ifmileageself。odometerreading:self。odometerreadingmileageelse:print(Youcantrollbackanodometer!)defincrementodometer(self,miles):ifmiles0:self。odometerreadingmileselse:print(Youcantrollbackanodometer!)deffillgastank(self):print(Thiscardoesntneedagastank!)classBattery():definit(self,batterysize70):self。batterysizebatterysizedefdescribebattery(self):print(Thiscarhasastr(self。batterysize)kwhbattery。)defgetrange(self):ifself。batterysize70:range240elifself。batterysize85:range270messageThiscarcangoapproximatelystr(range)messagemilesonafullcharge。print(message)classElectricCar(Car):definit(self,make,model,year):super()。init(make,model,year)self。batteryBattery()deffillgastank(self):print(Thiscardoesntneedagastank!)myteslaElectricCar(tesla,models,2016)print(mytesla。getdescriptivename())mytesla。fillgastank()mytesla。batteryBattery(85)修改电池默认值mytesla。battery。describebattery()mytesla。battery。getrange()输出结果为:2016TeslaModelS。Thiscardoesntneedagastank!Thiscarhasa85kwhbattery。Thiscarcangoapproximately270milesonafullcharge。四、导入模块与从其他模块导入函数方法一致五、Python标准库fromcollectionsimportOrderedDictfavoritelanguagesOrderedDict()favoritelanguages〔jen〕pythonfavoritelanguages〔sarah〕cfavoritelanguages〔edward〕rubyfavoritelanguages〔phil〕pythonforname,languageinfavoritelanguages。items():print(name。title()sfavoritelanguageislanguage。title()。)输出结果为:JensfavoritelanguageisPython。SarahsfavoritelanguageisC。EdwardsfavoritelanguageisRuby。PhilsfavoritelanguageisPython。字典能将信息关联起来,但不记录添加键值对的顺序。使用collections中的OrderedDict类可以创建字典并记录其中的键值对的添加顺序。六、注类名单词首字母大写,不使用下划线;实例名和模块名都采用小写,单词之间加上下划线。每个类后都应紧定义一个文档字符串简要描述类的功能。用一个空行分隔方法,用两个空行分隔类。