Python程序开发基础 课件 项目8 活学活用面向对象_第1页
Python程序开发基础 课件 项目8 活学活用面向对象_第2页
Python程序开发基础 课件 项目8 活学活用面向对象_第3页
Python程序开发基础 课件 项目8 活学活用面向对象_第4页
Python程序开发基础 课件 项目8 活学活用面向对象_第5页
已阅读5页,还剩49页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

类的特殊方法—获取网页数据任务描述写一个网页数据操作类(提示:需要用到urllib模块)。完成以下功能:(1)get_httpcode():获取网页的状态码并返回结果;例如:200,301,404等,类型为int。(2)get_htmlcontent():获取网页的内容,返回类型为str。(3)get_linknum():计算网页的链接数目。本任务要求编写程序,定义网页类page_data,分别创建get_httpcode()、get_htmlcontent()、get_linknum()方法,通过构造方法获取百度网页的数据。Python系统内置了几个特殊的方法,它们是构造方法与析构方法、类方法和静态方法。01构造方法与析构方法02静态方法与类方法03任务实现构造方法与析构方法01构造方法每个类都有一个默认的__init__()方法,即构造方法。如果定义类时显式地定义__init__()方法,那么创建对象时Python解释器会调用显式定义的__init__()方法;如果定义类时没有显式定义__init__()方法,那么Python解释器会调用默认的__init__()方法。构造方法__init__()方法按照参数的有无(self除外)可分为无参构造方法和有参构造方法。无参构造方法:无参构造方法中可以为属性设置初始值,此时使用该方法创建的所有对象都具有相同的初始值。有参构造方法:有参构造方法中可以使用参数为属性设置初始值,此时使用该方法创建的所有对象都具有不同的初始值。构造方法定义一个Information类,在该类中显式地定义一个带有3个参数的__init__()方法。classInforamtion(object):def__init__(self,name,sex):=nameself.sex=sexinfomation=Inforamtion('李婉','女')前面在类中定义的属性是类属性,可以通过对象或类进行访问;在构造方法中定义的属性是实例属性,只能通过对象进行访问。构造方法计算学生成绩。定义一个学生类,具体要求如下:1.有如下属性:姓名、年龄、成绩(语文,数学,英语),其中每科成绩的类型为整数。2.有如下方法获取学生的姓名:get_name(),返回值类型为str;获取学生的年龄:get_age(),返回值类型为int。返回3门科目中的最高分:get_course(),返回类型为int。写好类以后,定义一个学生实例进行测试。classStudnet(object):def__init__(self,name,age,score):=nameself.age=ageself.score=scoredefget_name(self):returndefget_age(self):returnself.agedefget_course(self):returnmax(self.score)zm=Studnet('Gaoyong',20,[82,96,88])print(zm.get_name())print(zm.get_age())print(zm.get_course())析构方法当一个对象的引用计数器数值为0时,就会调用__del__()方法,这个方法就是类的析构方法。importsysclassDestruction(object):def__del__(self):print('对象被释放')destruction=Destruction()print(sys.getrefcount(destruction))析构方法Python的析构方法采用的是垃圾回收机制。Python中的垃圾回收主要采用的是引用计数。引用计数是一种内存管理技术,它通过引用计数器记录所有对象的引用数量,当对象的引用计数器数值为0时,就会将该对象视为垃圾进行回收。getrefcount()函数是sys模块中用于统计对象引用数量的函数,其返回结果通常比预期的结果大1。这是因为getrefcount()函数也会统计临时对象的引用。类方法与静态方法02类方法实例方法定义时只比普通函数多一个self参数的方法称为实例方法,它只能通过类实例化的对象调用。classCar:

wheels=4

#

属性

defdrive(self):

#实例方法

print(‘开车方法')类方法与实例方法的不同点:类方法实例方法使用装饰器@classmethod修饰——类方法的第一个参数为cls,它代表类本身实例方法的第一个参数为self,它代表对象本身即可由对象调用,亦可直接由类调用只能由对象调用可以修改类属性无法修改类属性类方法定义类方法类方法可以被类名或对象名调用,其语法格式如下:类名.类方法对象名.类方法修改类属性在实例方法中无法修改类属性的值,但在类方法中可以修改类属性的值。classApple(object):count=0defadd_one(self):#实例方法

self.count=1@classmethoddefadd_two(cls):#类方法cls.count=2apple=Apple()apple.add_one()print(Apple.count)Apple.add_two()print(Apple.count)02静态方法静态方法与实例方法的不同:静态方法实例方法使用装饰器@staticmethod修饰——方法中需要以“类名.方法/属性名”的形式访问类的成员方法中需要以“self.方法/属性名”的形式访问类的成员既可由对象调用,亦可由类调用只能由对象调用定义一个包含属性num与静态方法static_method()的类Example。classExample:num=10#类属性@staticmethod#定义静态方法defstatic_method():print(f"类属性的值为:{Example.num}")print("静态方法")任务实现03获取百度网页数据#获取网页数据importurllib.requestclassPage_data(object):def__init__(self,url_add):self.url=url_adddefget_httpcode(self):status=urllib.request.urlopen(self.url).codereturnstatusdefget_htmlcontent(self):contentstr=urllib.request.urlopen(self.url).read()returncontentstrdefget_linknum(self):content=urllib.request.urlopen(self.url).read()returnlen(content.decode('utf-8').split('<ahref'))-1

A=Page_data('')print(A.get_httpcode())print(A.get_htmlcontent())print(A.get_linknum())

任务总结Python系统内置了构造方法与析构方法、类方法和静态方法。每个类都有一个默认的__init__()方法,即构造方法。__init__()方法有无参构造方法和有参构造方法之分。无参构造方法是指无参构造方法中可以为属性设置初始值,此时使用该方法创建的所有对象都具有相同的初始值。有参构造方法是指有参构造方法中可以使用参数为属性设置初始值,此时使用该方法创建的所有对象都具有不同的初始值。当一个对象的引用计数器数值为0时,就会调用__del__()方法,即析构方法。析构方法是为避免无用对象占用空间。类方法是定义在类内部,使用装饰器@classmethod修饰的方法。而静态方法是定义在类内部,使用装饰器@staticmethod修饰的方法。谢谢观看面向对象-设计人机猜拳游戏任务描述

猜拳游戏又称“猜丁壳”,是一个古老、简单的游戏,常用来解决争议的情况。猜拳游戏有三种手势表示,即剪子、石头、布。游戏规则是:剪子胜布、石头胜剪子、布胜石头。

本任务是编写程序,实现人机猜拳游戏。要求采用面向对象的程序设计思想。俗话说“老猫房上睡,一辈传一辈”,这句话说出了自然界的继承关系。Python中类与类之间也同样具有继承关系。01单继承与多继承02方法重写03任务实现单继承与多继承01单继承Python中类与类之间具有继承关系,其中被继承的类称为父类或基类,继承的类称为子类或派生类。子类在继承父类时,会自动拥有父类中的方法和属性。单继承指的是子类只继承一个父类,其语法格式如下:class子类(父类)单继承定义一个表示两栖动物的父类Amphibian和一个表示青蛙的子类Frog。classAmphibian(object):name="两栖动物"deffeatures(self):print("幼年用鳃呼吸")print("成年用肺兼皮肤呼吸")classFrog(Amphibian):defattr(self):print(f"青蛙是{}")print("我会呱呱叫")frog=Frog()print()frog.features()frog.attr()多继承多继承指的是一个子类继承多个父类,其语法格式如下:class子类(父类A,父类B,...):定义English类、Math类与Student类,使Student类继承English类与Math类。classEnglish:defeng_know(self):print('具备英语知识。')classMath:defmath_know(self):print('具备数学知识。')classStudent(English,Math):defstudy(self):print('学生的任务是学习。')stu=Student()stu.eng_know()stu.math_know()stu.study()多继承classHorse(object):defrun(self):print("马儿奔跑")classDonkey(object):defrun(self):print("驴儿打滚")classMule(Horse,Donkey):passmule=Mule()mule.run()方法重写02方法的重写子类可以继承父类的属性和方法,若父类的方法不能满足子类的要求,子类可以重写父类的方法,以达到理想的需求。父类定义如下:classCat(Felines):name="猫"defspeciality(self):print(f'{}会抓老鼠')print(f'{}会爬树')子类定义如下:classFelines:defspeciality(self):print("猫科动物特长是爬树")方法的重写#父类定义如下classFelines:defspeciality(self):print("猫科动物特长是爬树")#子类定义如下classCat(Felines):name="猫"defspeciality(self):print(f'{}会抓老鼠')print(f'{}会爬树')cat=Cat()cat.speciality()运行结果是:猫会抓老鼠猫会爬树>>>从运行结果可以看到,子类Cat重写了父类Felines的父类的speciality()方法super()函数如果子类重写了父类的方法,但仍希望调用父类中的方法,那么可以使用super()函数实现。super()只能在子类中使用,用于调用父类中的方法。super().方法名()classFelines:defspeciality(self):print("猫科动物特长是爬树")classCat(Felines):name="猫"defspeciality(self):print(f'{}会抓老鼠')print(f'{}会爬树')cat=Cat()cat.speciality()super().speciality()任务实现03设计人机猜拳游戏

#设计人机猜拳游戏importrandomclassPlayer:def__init__(self):self.dict={0:'剪刀',1:'石头',2:'布'}#手势defgesture(self):player_input=int(input("请输入(0剪刀、1石头、2布:)"))returnself.dict[player_input]classAIPlayer(Player):play_data=[]defai_gesture(self):whileTrue:computer=random.randint(0,2)iflen(self.play_data)>=4:#获取玩家出拳的最大概率max_prob=max(self.play_data,key=self.play_data.count)ifmax_prob=='剪刀':return'石头'elifmax_prob=='石头':return'布'else:return'剪刀'else:returnself.dict[computer]设计人机猜拳游戏

classGame:defgame_judge(self):player=Player().gesture()AIPlayer().play_data.append(player)aiplayer=AIPlayer().ai_gesture()if(player=='剪刀'andaiplayer=='布')or\(player=='石头'andaiplayer=='剪刀')\or(player=='布'andaiplayer=='石头'):print(f"电脑出的手势是{aiplayer},恭喜,你赢了!")elif(player=='剪刀'andaiplayer=='剪刀')or\(player=='石头'andaiplayer=='石头')\or(player=='布'andaiplayer=='布'):print(f"电脑出的手势是{aiplayer},打成平局了!")else:print(f"电脑出的手势是{aiplayer},你输了,再接再厉!")defgame_start(self):self.game_judge()whileTrue:option=input("是否继续:y/n\n")ifoption=='y':self.game_judge()else:breakg=Game()g.game_start()任务总结俗话说“老鼠的儿子会打洞”,这句话说出了自然界的继承关系。Python中类与类之间也同样具有继承关系,其中被继承的类称为父类或基类,继承的类称为子类或派生类。子类在继承父类时,会自动拥有父类中的方法和属性。当子类只继承一个父类称为单继承。子类继承父类后,就拥有了从父类继承的属性和方法,它既可以调用自己的方法,也可以调用从父类继承的方法。当一个子类继承多个父类时称为多继承。如果子类具有多个父类,也自动拥有所有父类的公有成员。谢谢观看定义类和创建对象任务描述类和对象是面向对象的程序设计中两个非常重要的概念。本任务要求掌握类和对象的概念、定义和创建的方法,为后续面向对象的编程打下坚实的基础。01类的概念及定义02对象及其创建类的概念及其定义01类和对象面向对象的思想中提出了两个概念:类和对象。类:类是对多个对象共同特征的抽象描述,它是对象的模板。将具有相同属性及相同行为的一组对象称为类(class)。类提供一个抽象的描述,其内部包括属性和方法两个主要部分,类可以说是创建对象时所使用的模板。类的定义类中可以定义数据成员即属性和成员函数即方法,属性用于描述对象特征,方法用于描述对象行为。定义格式如下:class类名:

属性名=属性值def方法名(self):

方法体class类名(object):

属性名=属性值def方法名(self):

方法体注意:类名采用驼峰命名法。或类的定义譬如:classCar:wheel=4name=“宝马”defdirve(self):print(“开车”)defstop(self):print(“停车”)classStudent(object):age=19grade=“university”defstudy(self):print(“我爱学习”)defexper(self):print(“我爱实验”)对象及创建02对象的概念对象(object)是现实世界中可描述的事物,它可以是有形的也可以是无形的。对象可以是有生命的个体,譬如,一个人或一只鸟。对象也可以是无生命的个体,譬如,一辆车或一台电脑。对象还可以是一个抽象的概念,譬如,天气的变化或一场运动会。对象是构成世界的一个独立单位,它由数据(描述事物的属性)和作用于数据的操作(体现事物的方法)构成一个独立整体。创建对象类定义完成后不能直接使用,需要实例化为对象才能实现其意义。对象的创建:对象名=类名()譬如:my_car1=Car()my_car2=Car()stu1=Student()stu2=Student()访问对象成员若想在程序中真正地使用对象,需掌握访问对象成员的方法。对象成员分为属性和方法,其访问格式分别如下:譬如:my_my_car1.drive()my_car2.wheelMy_car2.stop()stu1.gradestu1.study()stu2.agestu2.study()对象名.属性对象名.方法()访问限制类中定义的属性和方法都默认为公有属性和方法,由该类创建的对象可以任意访问类的公有成员。为了契合封装原则,保证类成员不被对象轻易访问。Python支持将类中的成员设置为私有成员,在一定程度上限制了对象对类成员的访问。创建私有成员

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论