版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第6章面向对象编程基础类和对象类的定义和实例化实例与类的对象属性成员属性与成员方法类的继承与多态类和对象类的定义和实例化实例与类的对象属性成员属性与成员方法类的继承与多态了解面向对象基本概念掌握类和对象的关系掌握类的属性和方法掌握类方法和静态方法的定义与使用掌握类的继承、多态类和对象
6.16.1类和对象面向对象面向对象编程(ObjectOrientedProgramming,OOP)是一种程序设计思想。我们经常听说的面向对象编程就是主要针对大型软件设计而提出的,它可以使软件设计更加灵活,并且能更好地进行代码复用,这些优势主要来自于面向对象程序设计的三个基本特性:封装性、继承性、多态性。Python从设计之初就已经是一门面向对象的语言。它可以很方便地创建类和对象。6.1类和对象1.什么是类类是用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。在Python语言中,使用class关键字定义类,关键字之后有一个空格,然后类的名称,最后一个冒号,换行定义类的内部实现。6.1类和对象2.什么是对象对象是某个具体的实物,也可以说万物皆对象,对象拥有自己的特征和行为。如:你手中的手机,你身边的某台电脑,你用的水杯等。从概念层面讲,就是某种事物的抽象(功能)。抽象原则包括数据抽象和过程抽象两个方面:数据抽象就是定义对象的属性,过程抽象就是定义对象的操作。6.1类和对象3.类和对象的关系类是对象的类型,对象是类的实例。二者相辅相成,谁也离不开谁。类与对象的关系:用类去创建(实例化)一个对象。开发中,先有类,才有对象。类类是对多个对象共同特征的抽象描述,它是对象的模板。对象对象用于描述现实中的个体,它是类的实例。类的定义和实例化
类的定义类的实例化6.26.2.1类的定义类是一个数据结构,类定义数据类型的数据(属性)和行为(方法)。对象是类的具体实体,也可以称为类的实例(instance)。在Python语言中,类称为类对象(classobject);类的实例称为实例对象(instanceobject),如Student类,而实例是根据类创建出来的一个具体的“对象”,每个对象都拥有相同的方法,但各自的数据可能不同。6.2.1类的定义在Python中,通过class关键字定义类,在使用类时一般需要先实例化,然后才能调用实例化后的类的方法和属性等。定义类的语法格式:classClassName:
类的实体类名通常是以大写开头的单词。名为有效的标识符,命名规则一般为多个单词组成的名称,每个单词除第一个字母大写外,其余的字母均小写类体由缩进的语句块组成。定义类时,用变量形式表示的对象属性称为数据成员或者属性(成员变量),用函数形式表示的对象行为称为成员函数(成员方法)。成员属性和成员方法统称为类的成员。例【6-1】类的定义示例。classStudent:name="木子"defstudy(self):print("哈哈,我正在学习中")6.2.2类的实例化类是抽象的,如果要使用类定义的功能,就必须实例化类,即创建类的对象。在创建实例对象后,可以使用“.”运算符来调用其成员创建类的对象、创建类的实例、实例化类等说法是等价的,都说明以类为模板生成了一个对象的操作。比如:定义好了Student类,定义完类后,并不会真正创建一个实例。语法格式:obj=Student()定义了具体的对象后,并通过“对象名.成员”形式访问其中的数据成员或者成员方法。6.2.2类的实例化例【6-2】类的创建与实例化。#class声明一个类classStudent:name='木子'#self是class内创建函数自带第一个位置的参数,命名可自定义
deffuncA(self):print("正在学习中")x=Student #实例化对象print()#输出对象的属性x.funcA(‘’) #调用对象的方法运行结果:木子正在学习中实例与类的对象属性实例对象属性类对象属性实例对象属性与类对象属性区别与联系6.36.3.1实例对象属性类的数据成员是在类中定义的成员变量(域),用来存储描述类的特征的值,称承之为属性。比如:人的姓名、年龄、身高、体重…都是对象的属性。属性可以被该类中定义的方法访问,也可以通过类对象或实例对象进行访问。在在函数体或代码块中定义的局部变量只能在其定义的范围内进行访问。属性实际上是在类中的变量。Python变量不需要声明,可直接使用。建议在类定义的开始位置初始化类属性,或者在构造函数(__init__())中初始化实例属性。6.3.1实例对象属性实例对象属性,也称为实例对象变量,是指通过“self.变量名”定义的属性。类的每个实例都包含了该类的实例对象变量的一个单独副本,实例对象变量属于特定的实例。实例对象变量在类的内部通过self访问,在外部通过对象实例访问。实例对象属性一般在__init__()方法中通过如下形式初始化:self.实例变量名=初始值在其他实例函数中,通过self访问:self.实例变量名=值#写入self.实例变量名self.实例变量名
#读取创建对象实例后,通过对象实例访问:obj=类名() #创建对象实例obj.实例变量名=值#写入obj.实例变量名
#读取or初始化访问6.3.1实例对象属性例【6-3】实例对象属性应用示例。classStudent: #定义类Studentdef__init__(self,name,age):#__init__方法
=name #初始化,即成员变量nameself.age=age#初始化self.age,即成员变量agedefsay_hello(self):#定义类Student的函数say_hi()print('您好,我叫',)#在实例方法中通过读取成员变量nameobj=Student('木子',18)#创建对象obj.say_hello()#调用对象的方法print(obj.age)#通过obj.age读取成员变量age运行结果:您好,我叫木子186.3.2类对象属性Python也允许声明属于类对象本身的变量,即类对象属性,也称为类属性、类变量、类对象变量、静态属性。类属性属于整个类,不是特定实例的一部分,而多而是所有实例之间共享一个副本。对象属性一般在类体中通过如下形式初始化:类变量名=初始值在其类定义的方法中或外部代码中,通过类名访问:类名.类变量名=值#写入类名.类变量名#读取6.3.2类对象属性例【6-4】类对象属性的应用。classStudent:count=0#定义属性count,表示计数
name="初心"#定义属性name,表示名称
Student.count+=1#通过类名访问,将计数加1print(Student.count)#类名访问,读取并显示类属性print(S)#类名访问,读取并显示类属性obj1=Student()#创建实例对象1obj2=Student()#创建实例对象2print((,))#通过实例对象访问,读取成员变量的值S="木子"#通过类名访问,设置类属性值print((,))#读取成员变量的值="吴怡晴"#通过实例对象访问,设置实例对象成员变量的值print((,))#读取成员变量的值运行结果:1初心('初心','初心')('木子','木子')('吴怡晴','木子')6.3.3实例对象属性与类对象属性区别与联系类对象属性与实例对象属性的区别类对象属性是在类中所有成员方法外部以“类名.属性名”形式定义的,实例对象属性则是在构造方法或其他实例方法中以“self.属性名”形式定义的。2.定义的位置和方法不同类对象属性是通过类对象以“类名.属性名”形式访问的,实例对象属性则是通过类实例以“对象名.属性名”形式访问的。3.访问的方法不同类对象属性属于类对象本身,可以由类的所有实例共享,在内存中只存在一个副本;实例对象属性则属于类的某个特定实例。如果存在同名的类对象属性和实例对象属性,则两者相互独立、互不影响。1.所属的对象不同6.3.3实例对象属性与类对象属性区别与联系类对象属性与实例对象属性的联系类对象和实例对象都是对象,它们所属的类都可以通过__class__属性来获取,类对象属于type类,实例对象则属于创建该实例时所调用的类。类对象和实例对象的属性值都可以通过__dict__属性来获取,该属性的取值是一个字典,每个字典元素的关键字和值分别对应属性名与属性值。如果要读取的某个实例对象属性不存在,但在类中定义了一个与其同名的类对象属性,则Python就会以这个类对象属性的值作为实例对象属性的值,同时还会创建一个新的实例对象属性。成员属性与成员方法
成员属性成员方法6.46.4.1成员属性封装是面向对象的主要特性。所谓封装,是把客观事物抽象并封装成对象,即将数据成员、属性、方法和事件等集合在一个整体内。通过访问控制可以隐藏内部成员,但只允许可信的对象访问或操作自己的部分数据或方法。封装保证了对象的独立性,可以防止外部程序破坏对象的内部数据,同时便于程序的维护和修改。6.4.1成员属性成员属性根据访问限制,可以分为私有属性和公有属性。Python类的成员没有访问控制限制,这与其他面向对象的程序设计语言不同。通常约定使用两个下画线开头,但是不以两个下画线结束的属性是私有的(private),其他为公共的(public)。不能直接访问私有属性,但可以在方法中访问。Python中通过一对前缀下划线“__”的属性名来定义私有属性。__private_attrs:两个下划线开头,声明该属性为私有,不能在类的外部被使用或直接访问。6.4.1成员属性例【6-5】私有属性与公有属性的定义与访问。classCustom(object):def__init__(self,name,money):=nameself.__money=moneyc=Custom('tom',100)print()print(c.__money)运行结果:Traceback(mostrecentcalllast):tomFile"C:/python_demo/demo.py",line13,in<module>print(c.__money)AttributeError:'Custom'objecthasnoattribute'__money'在Custom类中,实现了两个属性,其中name是普通属性,__money属性是私有属性。在通过类对象访问私有属性__money时,代码报错了,说明我们不可以在类的外部访问类的私有属性。6.4.1成员属性例【6-6】私有成员的访问。classCustom(object):def__init__(self,name):=namedefget_money(self):returnself.__moneydefset_money(self,money):ifmoney>0:self.__money=moneyelse:self.__money=0print('参数值错误!')c=Custom('tom')print()='TOM'print()c.set_money(-100)c.set_money(100)print(c.get_money())运行结果:tomTOM参数值错误!100非私有属性可以在类的外部访问和修改,而私有属性只能通过包含set的方法来修改。6.4.2成员方法1.类的成员方法定义方法是与类相关的函数,类方法的定义与普通的函数一致。一般情况下,类方法的第一个参数一般为self,这种方法称之为对象实例方法。对象实例方法对类的某个给定的实例进行操作,可以通过self显式地访问该实例。除了self不用传递,其他参数正常传入即可。成员方法的声明格式如下:def方法名(self,[形参列表]):函数体对象实例方法的调用格式如下:对象.方法名([实参列表])虽然类方法的第一个参数为self,但调用时,用户不需要也不能给该参数传值。事实上,Python自动把对象实例传递给该参数。注意6.4.2成员方法2.类方法的使用例【6-7】类方法的应用示例。classStudent(object):def__init__(self,name,age):=nameself.age=agedefprint_tell(self):print('%s:%d'%(,self.age))stu_1=Student('初心',18)stu_1.print_tell()运行结果:初心:18我们从外部看Student类,就只需要知道,创建实例需要给出name和age,而如何打印等都是在Student类的内部定义的,这些数据和逻辑被“封装”起来了,调用很容易,却不用知道内部实现的细节。通过类的实例名称和“.”操作符进行访问。即instanceName.functionName()6.4.2成员方法3.构造方法和析构函数构造方法(函数)是创建对象的过程中被调用的第一个方法,通常用于初始化对象中需要的资源,比如初始化变量。在定义构造方法时,需要在方法名的两侧加两个下划线,构造方法名为init。完整的构造方法:__init__()(前后分别为两个下画线)
。每当创建类的实例化对象的时候,__init__()方法都会默认被运行。其作用就是初始化已实例化后的对象。析构函数:__del__(),用来释放对象占用的资源。当一个对象被删除时,Python解释器会默认调用__del__()方法。6.4.2成员方法3.构造方法和析构函数例【6-8】初始化函数__init__()的应用。classStudent():def__init__(self,Name,Sex):=Nameself.sex=Sexprint(self.__class__)#验证初始化是否执行
defshowInfo(self,country):print('我是:',,',性别:',self.sex,'来自',country)xiaoming=Student("辛里美","女")xiaoming.showInfo('中国')#调用对象的方法运行结果:<class'__main__.Student'>我是:辛里美,性别:女来自中国6.4.2成员方法4.私有方法的定义与访问私有方法,方法名有两个前缀下划线'__',则表明该方法是私有方法。__private_method:两个下划线开头,声明该方法为私有方法,不能在类的外部调用。在类的内部调用self.__private_methods。6.4.2成员方法例【6-9】类的私有方法的定义与使用。classInterviewer(object):def__init__(self):self.wage=0defask_question(self):print('asksomequestion!')def__talk_wage(self):print('Calculatewage!')deftalk_wage(self):ifself.wage>20000:print('toohigh!')else:self.__talk_wage()print('welcometojoinus!')me=Interviewer()me.ask_question()#me.__talk_wage()me.wage=30000me.talk_wage()print('-'*20)me.wage=15000me.talk_wage()运行结果:asksomequestion!toohigh!--------------------Calculatewage!welcometojoinus!ask_question()方法是普通的方法,在类的外部可以直接调用,__talk_wage()方法是私有方法,只能在类的内部使用,如果在外部写调用的代码则报错。6.4.2成员方法5.私有方法的作用和说明私有属性和私有方法只能在类内部使用。定义私有方法和私有属性的目的主要有两个:保护数据或操作的安全性、向使用者隐藏核心开发细节。虽然私有属性和私有方法不能直接从外部访问和修改,但是通过间接的方法,可以获取和修改。在Python类中,没有真正的私有属性和私有方法。这并不是说私有属性和私有方法没有用,首先,外部不能直接使用了,其次,我们可以在访问私有属性和私有方法的间接方法中做一些必要的验证或干扰,保证数据的安全性,隐藏私有方法的实现细节。6.4.2成员方法6.方法重载Python对象要重载,定义一个方法即可实现多种调用。例【6-10】方法重载的应用示例。classStudent:#定义类Studentdefsay_hi(self,name=None):#定义类方法say_hi=name#把参数name赋值给,即成员变量name(域)
ifname==None:print('您好!')else:print('您好,我叫',)obj=Student()#创建对象obj.say_hi()#调用对象的方法,无参数obj.say_hi('吴怡晴')#调用对象的方法,带参数运行结果:您好!您好,我叫吴怡晴类的继承与多态类的继承与多重继承多态与多态性6.56.5.1类的继承与多重继承1.类继承的概念继承是面向对象的程序设计中代码重用的主要方法。在程序设计中实现继承,表示这个类拥有它继承的类的所有公有成员。在面向对象编程中,被继承的类称为父类或基类,新的类称为子类或派生类。具体的语法如下:classClassName(baseclasslist):statementClassName:用于指定类名。baseclasslist:用于指定要继承的基类,可以有多个,类名之间用逗号“,”分隔。如果不指定,将使用所有Python对象的根类object。statement:类体,主要由类变量(或类成员)、方法和属性等定义语句组成。如果在定义类时,没确定好类的具体功能,也可以在类体中直接使用pass语句代替。声明派生类时,必须在其构造函数中调用基类的构造函数。调用格式如下:基类名.__init__(self,参数列表)super().__init__(参数列表)注意6.5.1类的继承与多重继承1.类继承的概念例【6-11】创建基类Animal,包含两个数据成员name和age;创建派生类Dog,包含一个数据成员color。#动物类classAnimal(object):def__init__(self,name,age):=nameself.age=age
defeat(self,food):print(f"我是{},{self.age}岁,爱吃:{food}")#创建Dog类classDog(Animal):#从Animal继承
def__init__(self,name,age,color):#构造函数
Animal.__init__(self,name,age)#调用基类构造函数
self.color=color#颜色
defeat(self,food):Animal.eat(self,food)#调用基类的eat()方法
print(f"我是{},颜色是{self.color},爱吃:{food}")lala=Animal("拉普拉多",3)#实例化对象lala.eat("鱼罐头")jinmao=Dog('金毛',2,'金黄')jinmao.eat('牛肉罐头')运行结果:我是拉普拉多,3岁,爱吃:鱼罐头我是金毛,2岁,爱吃:牛肉罐头我是金毛,颜色是金黄,爱吃:牛肉罐头6.5.1类的继承与多重继承2.多重继承如果在继承中列了一个以上的类,那么它就被称作“多重继承”。classA: #定义类A…ClassB: #定义类B…classc(A,B): #维承类A和B…需要注意圆括号中父类的顺序,如果继承的父类中有相同的方法名,而在子类中使用时未指定,python将从左至右查找父类中是否包含方法。注意6.5.1类的继承与多重继承2.多重继承例【6-12】多重继承应用示例。classA(object):def__init__(self,name):=nameclassB(object):def__init__(self,age):self.age=ageclassC(A,B):def__init__(self,name,age):A.__init__(self,name)B.__init__(self,age)#实例化对象c=C('Marry',20)print()print(c.age)运行结果:Marry206.5.1类的继承与多重继承2.多重继承例【6-13】私有方法、私有属性不能被子类继承的示例。classFather(object):def__init__(self):self.home='China'self.__house='house'defmake_money(self):print('makemoney')def__project(self):print('projectwork')classSon(Father):defwork(self):print('worklikeadog!')s=Son()print(s.home)#print(s.__house)s.work()s.make_money()#s.__project()运行结果:Chinaworklikeadog!makemoney在父类中定义的普通属性和普通方法,子类都继承了,子类可以直接使用,但是父类中的私有属性和私有方法子类无法直接使用,因为子类不会继承父类的私有属性和私有方法。如果想访问,可以通过间接的方式访问。6.5.2多态与多态性1.多态的概念及应用对象可以表示多个类型的能力称为多态性。多态性允许每个对象以自己的方式去响应共同的消息,从而允许用户以更明确的方式建立通用软件,提高软件开发的可维护性。从编程的角度来说,实现多态,需要三个步骤:定义父类,并提供公共方法定义子类,并重写父类方法传递子类对象给调用者,可以看到不同子类执行效果不同。6.5.2多态与多态性1.多态的概念及应用例【6-14】多态的概念示例。classAnimal:defrun(self):raiseAttributeError('子类必须实现这个方法,否则报错。')classCat(Animal):defrun(self):print("猫可以行走。")classPig(Animal):defrun(self):print("猪可以走。")classDog(Animal):defrun(self):
print("狗可以走")ooc=Cat()oop=Pig()ood=Dog()ooc.run()oop.run()ood.run()运行结果:猫可以行走。猪可以走。狗可以走6.5.2多态与多态性2.多态性的概念及应用多态性指具有不同功能的函数可以使用相同的函数名,这样就可以用一个函数名调用不同内容的函数。专业说法:向不同的对象发送同一条消息,不同的对象在接收时会产生不同的行为(方
法),即每个对象可以用自己的方式去响应共同的消息。举例:比如在桌面上单击鼠标的右键,选中我的电脑之后,单机鼠标的右键,以及
在当前的打开word文档中单机鼠标的右键,这样三个不同对象,发出鼠标的
右键被按下,产生的菜单不一样。所谓消息就是调用函数,不同的行为就是指不同的实现,即执行不同的函数。6.5.2多态与多态性2.多态性的概念及应用例【6-15】多态性的应用示例。classAnimal:defrun(self):raiseAttributeError('子类必须实现这个方法,否则报错。')classCat(Animal):defrun(self):print("猫可以行走。")classPig(Animal):defrun(self):print("猪可以走。")classDog(Animal):defrun(self):print("狗可以走")ooc=Cat()oop=Pig()ood=Dog()#利用多态行:定义统一接口。deffunc(obj):obj.run()func(ooc)func(oop)func(ood)综合案例
简易银行账户管理系统实现6.66.6综合案例:简易银行账户管理系统实现例【6-16】利用面向对象设计编程思想,创建一个简单的银行账户管理系统。见教材运行结果:见教材类是用来描述具有相同的属性和方法的对象的集合。对象是类的实例。类与对象的关系:用类去创建(实例化)一个对象。开发中,先有类,才有对象。通过class定义类,并创建类的实例为类名()。在构建析构函数时,__init__()必须包含一
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 临床基因扩增检验实验室技术审核制度
- 骨科护理创新案例分享
- 精神分裂症试题及答案解析(含判断+单选+多选)
- 绢人工安全宣贯水平考核试卷含答案
- 煤层气预处理值班员操作能力模拟考核试卷含答案
- 石英晶体生长设备操作工安全强化模拟考核试卷含答案
- 网球制作工安全素养竞赛考核试卷含答案
- 山石盆景工安全防护考核试卷含答案
- 汽车回收工班组协作知识考核试卷含答案
- 医用供气工冲突解决强化考核试卷含答案
- 2026湖南长沙开福区数铸科技有限责任公司招聘1人考试备考试题及答案解析
- 水利水电建设安全生产检查管理办法培训
- 2026年茶艺师高级考试题库附答案
- 2026福建福州闽江琅岐港务有限公司招聘6人笔试参考题库及答案解析
- 警卫队员行为准则
- 2026年安全生产月主题宣贯课件
- 无为市乡村振兴控股集团及其下属公司招聘笔试题库2026
- 2026广西真龙彩印包装有限公司招聘30人考试备考题库及答案解析
- 2026山东省中医药研究院附属医院合同制工作人员招聘考试模拟试题及答案解析
- 2026欧州木材加工制造业市场供需分析报告及投资发展前景规划研究
- 2026年北京市东城区高三二模英语试卷(含答案)
评论
0/150
提交评论