第6章-类和继承

第6章-类和继承

ID:81932230

大小:1.79 MB

页数:35页

时间:2022-10-14

上传者:胜利的果实
第6章-类和继承_第1页
第6章-类和继承_第2页
第6章-类和继承_第3页
第6章-类和继承_第4页
第6章-类和继承_第5页
第6章-类和继承_第6页
第6章-类和继承_第7页
第6章-类和继承_第8页
第6章-类和继承_第9页
第6章-类和继承_第10页
资源描述:

《第6章-类和继承》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

2022/6/10第6章类和继承主讲人:

1目录2022/6/1021.类和对象2.实例属性和类属性3.类的方法4.构造函数5.析构函数6.运算符的重载7.继承重点

22022/6/101.类和对象Python中使用class保留字来定义类,类名的首字母一般要大写,例如:classMyclass(object):definfor(self):print("thisisaclass")class后面紧接着类名,即Myclass,类名通常是大写开头的单词,紧接着是(object),表示该类是从哪个类继承下来的。类Myclass中只有一个方法infor,类的方法至少有一个参数self,self代表将来要创建的对象本身。

32022/6/101.类和对象当class语句执行时,这只是赋值给对象的变量,而对象可以用任何普通表达式引用。例如,Firstclass是写在模块文件内,而不是在交互模式下输入的,就可将其导入,在类开头的那行可以正常地使用它的名称。fromtextimportFirstclassclassSecondclass(Firstclass):defdisplay(self):…或者,其等效写法如下。importtextclassSecondclass(text.Firstclass):defdisplay(self):…

42022/6/101.类和对象类与对象示例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.hungryFalse>>>b1.hungryFalse

52022/6/101.类和对象类和对象是面向对象编程的两个主要方面,类创建一个新类型,而对象是这个类的实例。这类似于上面一个类Bird(),而b1是类Bird的一个实例,也就是类的一个对象(实例)。类的组成元素:关键字(类):class类的名字:Bird构造函数:__init__(self)类的方法:eat(self)(b1.eat())类的特性:hungry(b1.hungry)

62022/6/101.类和对象类与对象格式类的组成: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_variable

72022/6/101.类和对象对象定义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)

8目录2022/6/1021.类和对象2.实例属性和类属性3.类的方法4.构造函数5.析构函数6.运算符的重载7.继承重点

92022/6/102.实例属性和类属性属性有两种,一种是实例属性,另一种是类属性。实例属性是在构造函数__init__中定义的,定义时以self作为前缀类属性是在类中方法之外定义的属性。在主程序中(在类的的外部),实例属性属于实例(对象)只能通过对象名访问;类属性属于类可通过类名访问。在类的方法中可以调用类的其它方法,可以访问类属性、对象属性。

102022/6/102.实例属性和类属性实例属性和类属性。程序:classCar:price=100000#定义类属性def__init__(self,c):self.color=c#定义实例属性

112022/6/102.实例属性和类属性#主程序car1=Car("Red")car2=Car("Blue")printcar1.color,Car.priceCar.price=110000#修改类属性Car.name='QQ'#增加类属性car1.color="Yellow"#修改实例属性printcar2.color,Car.price,Car.nameprintcar1.color,Car.price,Car.name程序运行结果:Red100000Blue110000QQYellow110000QQ

122022/6/102.实例属性和类属性如果属性名以__(双下划线)开头则是私有属性,否则是公有属性。私有属性在类外不能直接访问。Python提供了访问私有属性的方式,可用于程序的测试和调试。对象名._类名+私有成员名classFood:def__init__(self):self.__color='red'self.price=10apple=Food()apple.price=20print(apple.price,apple._Food__color)#访问私有成员apple.(_)Food__color="Blue"print(apple.price,apple._Food__color)print(apple.__color)#不能直接访问私有属性程序运行结果如下。20red20Blueprint(apple.__color)#不能直接访问私有属性

13目录2022/6/1021.类和对象2.实例属性和类属性3.类的方法4.构造函数5.析构函数6.运算符的重载7.继承重点

142022/6/103.类的方法类有3种方法:公有方法、私有方法和静态方法。双下划线__开头则是私有方法,上一行用@staticmethod标识的方法是静态方法,否则是公有方法。公有方法、私有方法都属于对象,每个对象都有自己的公有方法和私有方法;公有方法通过对象名调用,私有方法不能通过对象名调用,只能在属于对象的方法中通过self调用;静态方法属于类,静态方法只能通过类名调用,静态方法中不能访问属于对象的成员,只能访问属于类的成员。

152022/6/103.类的方法公有方法、私有方法和静态方法的定义和调用。classFruit:price=0def__init__(self):self.__color='Red'#定义和设置私有属性colorself.__city='Kunming'#定义和设置私有属性citydef__outputColor(self):#定义私有方法outputColorprint(self.__color)#访问私有属性colordef__outputCity(self):#定义私有方法outputCityprint(self.__city)#访问私有属性city

162022/6/103.类的方法defoutput(self):#定义公有方法outputself.__outputColor()#调用私有方法outputColorself.__outputCity()#调用私有方法outputCity@staticmethoddefgetPrice():#定义静态方法getPricereturnFruit.price@staticmethoddefsetPrice(p):#定义静态方法setPriceFruit.price=p

172022/6/103.类的方法#主程序apple=Fruit()apple.output()print(Fruit.getPrice())Fruit.setPrice(9)print(Fruit.getPrice())apple.__outputColor()#是否可行?思考:能否添加公有方法,以便能通过对象名访问私有成员变量__color?程序运行结果:RedKunming09

18目录2022/6/1021.类和对象2.实例属性和类属性3.类的方法4.构造函数5.析构函数6.运算符的重载7.继承重点

192022/6/104.构造函数类的构造函数定义类的构造函数的形式为:def__init__(self):superclass.__init__(self)#未绑定超类super(subclass,self).__init__()#调用super()statement类的构造函数与其它普通方法不同的地方在于,当一个对象被创建后,会立即调用构造方法,就有点类似于程序中的init的初始化方法。如果要继承构造方法,可以调用未绑定的超类构造方法,也可以用super函数调用超类构造函数。

202022/6/104.构造函数Python在创建对象时,首先调用特殊方法__new__()创建该对象,之后调用特殊方法__init__()对其进行初始化。在实际的编程中,我们创建的几乎所有Python类都只需要重新实现__init__()方法,因为如果我们不提供自己的__new__()方法,Python会自动调用object.__new__()方法。classStudent(object):def__init__(self,first='',last='',id=0):self.firstnamestr=firstself.lastnamestr=lastself.idint=id

212022/6/104.构造函数>>>s1=Student()>>>print(s1.firstnamestr)>>>s2=Student(last='Python',first='Hello')>>>print(s2.lastnamestr)Python这里生成了Student类的两个实例—s1和s2。s1调用构造函数时生成,没有带任何参数,即Student()。生成第二个实例s2时,给出了参数中的两个,即Student(last='Python',first='Hello')。

22目录2022/6/1021.类和对象2.实例属性和类属性3.类的方法4.构造函数5.析构函数6.运算符的重载7.继承重点

232022/6/105.析构函数Python中类的析构函数是__del__(开始和结束都是双下划线),用来释放对象占用的资源,在Python收回对象空间之前自动执行。如果用户未设计析构函数,Python将提供默认的析构函数。析构函数属于对象,每个对象都有自己的析构函数。classCar:def__init__(self,n):self.num=nprint('编号为',self.num,'的对象出生了')def__del__(self):print('编号为',self.num,'的对象死了')

242022/6/105.析构函数car1=Car(1)car2=Car(2)delcar1delcar2程序运行结果如下。编号为1的对象出生了编号为2的对象出生了编号为1的对象死了编号为2的对象死了

25目录2022/6/1021.类和对象2.实例属性和类属性3.类的方法4.构造函数5.析构函数6.运算符的重载7.继承重点

262022/6/106.运算符的重载在Python中可通过重载运算符来实现对象之间的运算。Python把运算符与类的方法关联起来,每个运算符都对应一个函数。运算符重载就是让用类写成的对象可截取并响应用在内置类型上的运算(加法、切片、打印和点号运算符等)。

272022/6/106.运算符的重载例如,Number类提供一个方法来拦截实例的构造函数(__init__),此外还有一个方法捕捉减法表达式(__sub__)。这种特殊的方法可与内置运算相绑定。classNumber:def__init__(self,start):self.data=startdef__sub__(self,other):returnNumber(self.data-other)>>>x=Number(5)>>>y=x-2>>>y.data3

282022/6/106.运算符的重载重载方法举例:1.索引和分片:__getitem__和__setitem__如果类中定义了(或继承了)的话,则对于实例的索引运算,会自动调用__getitem__。当实例x出现在x[i]这样的索引运算中,Python会调用这个实例继承的__getitem__方法,把x作为第一个参数传递,并将方括号内的索引值传给第二个参数。例如,下面的类将返回索引值。>>>classIndex:def__getitem__(self,index):returnindex…>>>x=Index()>>>x[3]3>>>foriinrange(6):print(x[i],end='')…012345

292022/6/106.运算符的重载2.索引迭代:__getitem__for语句的作用是从0到更大的索引值,重复对序列进行索引运算,直到检测到超出边界的异常。__getitem__也可以是Python中一种重载迭代的方式。如果定义了这个方法,for循环每次循环时都会调用类的__getitem__。并持续搭配有更高的偏移值。>>>classStepper:def__getitem__(self,i):returnself.data[i]…>>>x=Stepper()>>>x.data='spam'>>>x[1]'p'>>>foriteminx:print(item,end='')…spam

302022/6/106.运算符的重载3.迭代器对象:__iter__和__next__上一页__getitem__是有效的,但它是迭代退而求其次的方法。Python所有的迭代环境会有优先尝试__iter__的方法,再尝试__getitem__。从技术角度上讲,迭代环境是通过iter去尝试寻找__iter__方法来实现,而这种方法返回一个迭代器对象。如果已经提供了,python会重复调用迭代器对象的next()方法,直到发生StopIteration异常。如果没有找到__iter__,python会使用__getitem__机制。

312022/6/106.运算符的重载classSquares:def__init__(self,start,stop):self.value=start-1self.stop=stopdef__iter__(self):returnselfdef__next__(self):ifself.value==self.stop:raiseStopIterationself.value+=1returnself.value**2>>>foriinSquares(1,5):print(i,end='')…1491625

32目录2022/6/1021.类和对象2.实例属性和类属性3.类的方法4.构造函数5.析构函数6.运算符的重载7.继承重点

332022/6/107.继承继承是为代码重用而设计的,当我们设计一个新类时,为了代码重用可以继承一个已设计好的类。在继承关系中,原来设计好的类称为父类,新设计的类称为子类。子类继承父类时用class子类名(父类名)来表示。子类能继承父类的所有公有成员。在需要的时候,在子类中可通过super()来调用父类的构造函数,也可通过父类名来调用父类的构造函数。

342022/6/107.继承>>>classSuper:defmethod(self):print('inSuper.method')…>>>classSub(Super):defmethod(self):print('startingSub.method')Super.method(self)print('endingSub.method')>>>X=Super()>>>X.method()inSuper.method>>>X=Sub()>>>X.method()startingSub.methodinSuper.methodendingSub.method

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。
最近更新
更多
大家都在看
近期热门
关闭