当前位置: 首页 > 科技观察

Python面向对象程序设计-初阶

时间:2023-03-14 10:28:17 科技观察

前言面向对象:利用对象(实体)的概念建立模型,模拟在客观世界中分析、设计和实现软件的方法。面向对象编程(简称OOP)是一种解决软件重用的设计和编程方法。它以类的形式描述了软件系统中类似的操作逻辑和操作应用数据和状态,并将它们作为对象使用。实例表单在软件系统中复用,提高了软件开发的效率。面向对象编程是Python中一个极其重要的概念。一、面向对象和面向过程1、两种软件开发设计方法面向过程编程:按照业务逻辑自上而下,将需要使用的功能代码封装成函数,着重于发展的步骤和过程。典型代码为C语言(关注过程)面向对象编程:对功能或需要的功能进行分类封装,关注具体是哪个类和函数实现功能,典型代码为Java、C++等语言(关注结果)2.面向对象相关术语类(Class):用来描述具有相同属性和方法的对象的集合,它定义了集合中每个对象所共有的属性和方法,一个对象是一个实例一类。实例:也称为对象。通过类定义的初始化方法,赋予特定的值,成为“有血有肉的实体”。类变量:类变量在实例化对象中是通用的。类变量在类内和函数体外定义。类变量一般不作为实例变量使用。数据成员:类变量或实例变量,用于处理类及其实例对象相关的数据。方法重写:如果从父类继承的方法不能满足子类的需要,可以重写。这个过程称为方法覆盖,也称为方法重写。局部变量:方法中定义的变量只适用于当前实例的类。实例变量:在类的声明中,属性由变量表示。此类变量称为实例变量,在类声明内部但在类的其他成员方法之外声明。方法:类中定义的函数。方法重写:如果从父类继承的方法不能满足子类的需要,可以重写。这个过程称为方法覆盖,也称为方法重写。静态方法:无需实例化即可由类执行的方法。类方法:类方法是将类本身作为对象进行操作的方法。面向对象的三大特点:封装:将内部实现封装起来,使其对外透明,提供调用API接口的机制。继承:即派生类(derivedclass)继承了父类(baseclass)的变量和方法。多态性:根据对象类型不同对待。二、类与对象1、对象对象是面向对象编程的核心。在使用对象的过程中,为了抽象地定义一组具有共同特征和行为的对象,就形成了类。2.类1)概念类是一类事物,对象是这一类事物的具体实现,类具有相同的属性和行为2)类(class)的组成类名:名称类的属性:事物的特征方法:做什么3)抽象具有相同或相似的属性对象和行为可以抽象为一个类4)类的分类使用class关键字创建类,带上类名,然后加上括号。对象在括号内。这样的类称为:新型类;它们也可以不带圆括号和圆括号中的对象,这样的类称为:经典类。#新建类classMeeting2(object):pass#经典类classMeeting2:pass5)创建对象A=Meeting1()B6)self类方法的第一个参数必须是self(按照约定,可以是self,也可以是其他名字),调用时不必传入。self表示类的实例3.获取或添加对象属性。有一个名为meeting的类如下,里面初始化了name、age、sex、address、attack等属性,定义了introduction和attacked两个方法:classMeeting(object):"""类描述会议类"""def__init__(self,name,age,sex,address,attack):"""Constructor"""self.name=nameself.age=int(age)self.sex=sexself.address=地址self.attack=int(attack)defintroduction(self):print("Name:{}".format(self.name))print("Age:{}".format(self.age))print("性别:{}".format(self.sex))print("Address:{}".format(self.address))defattacked(self):print(f"{self.name}正在用{self攻击你.attack}!")defforeign_fun():print("Iamaforeignfunction")1.hasattr-检查对象是否包含指定的属性或方法用法:hasattr(object,name)功能:检查对象是否包含指定的属性或方法返回值:存在则返回true,不存在则返回false#实例化meetingclassMeeting=Meeting("ZhangSan",20,"Male","Nanjing",108)#获取Meeting对象中是否存在name属性print(hasattr(Meeting,"name"))#True#获取是否存在Meeting对象中存在mobile属性print(hasattr(Meeting,"mobile"))#False#获取Meeting对象中是否存在attackedmethodprint(hasattr(Meeting,"attacked"))#True2.getattr-获取对象中指定属性的属性值用法:getattr(object,name[,default])功能:获取指定属性的属性值对象返回值中的属性:如果存在,则返回该属性的属性值;如果不存在,则返回指定的内容#实例化会议类Meeting=Meeting("张三",20,"男","南京",108)#获取Meeting对象name属性的属性值inprint(getattr(Meeting,"name"))#张三#获取Meeting对象中kills属性或方法的值,如果不存在则返回指定内容print(getattr(Meeting,"kills","Thekillsmethodorattributewasnotfound"))#Thekillsmethodorattributewasnotfound#获取Meeting对象中被攻击的方法,返回值为函数地址print(getattr(Meeting,"attacked"))#使用getattr方法直接调用Meeting对象方法f=getattr(Meeting,"attacked")f()打印结果如下:3.setattr-为object对象的name属性设置指定值用法:setattr(object,name,value)函数:为object对象指定属性设置指定值返回值:#实例化meetingclassMeeting=Meeting("ZhangSan",20,"Male","Nanjing",108)#将对象中name属性的值改为“AndyLau”setattr(Meeting,"name","AndyLau")#获取对象中name的属性值print(getattr(Meeting,"name"))#刘德华#将对象外名为foreign_fun的方法引入到对象中,并重命名为"new_foreign_fun"setattr(Meeting,"new_foreign_fun",foreign_fun)#获取对象中是否有foreign_fun属性或方法,返回值为True或Falseprint(hasattr(Meeting,"foreign_fun"))#False#获取对象中是否有new_foreign_fun属性或方法,返回值为True或Falseprint(hasattr(Meeting,"new_foreign_fun"))#True打印结果如下:4.魔术方法1.__init__()Constructor__init__()方法是Python中的一种特殊方法,称为构造函数或初始化方法,在创建此类的实例时调用classMeeting(object):"""会议类的类描述"""def__init__(self,name,age,sex,address,attack):"""Constructor"""self.name=nameself.age=int(age)self.sex=sexself.address=addressself.attack=int(attack)C=Meeting("张三",20,"男","南京",108)print(C.name)#张Sanprint(C.address)#南京2.__del__()Destructor在删除一个对象时,Python解释器默认会调用一个方法__del__(),相当于unittest框架中的tearDown()函数def__del__(self):"""Destructor"""print("%sattackended"%(self.name))每调用一次对象,就会执行一次__del__()方法3.引用计数D=Meeting("ZhangSan",20,"Male","Nanjing",108)#计算当前实例的引用计数,D引用一次,sys.getrefcount(D)引用一次print(sys.getrefcount(D))#引用计数2D对象的2次,一次是D引用,一次是sys.getrefcount引用4.__str()__string函数__str__方法需要返回一个字符串,作为这个对象的描述信息,在使用print输出对象时,只要定义了__str__(self)方法,就会打印出这个方法返回的数据def__str__(self):"""Stringfunction""""return"IamthestringdescriptionoftheMeetingclass"#__str__():Stringfunction,当定义了__str__()方法时,打印对象,返回值打印__str__()方法,否则打印类的内存地址print(D)#我是Meeting类的字符串描述未定义__str__()方法,打印对象,打印Meeting类的内存地址:<__main__.Meetingobjectat0x014A7748>定义了__str__()方法后,打印对象,打印出来的是__str__()方法的返回值:我是Meeting类的字符串描述。attributes获取类的属性,包括一个字典,由类的数据属性组成#__dict__:获取类的属性,返回值为字典类型print(D.__dict__)#{'name':'张三','age':20,'sex':'男','address':'Nanjing','attack':108}2.__doc__:获取类classMeeting(object):"""meeting1类的类描述"""#__doc__:获取类的文档字符串print(D.__doc__)#meeting1类的类描述3.__name__:获取类名#__name__:获取类名print(Meeting.__name__)#Meeting4.__module__:类定义模块类的全名是'__main__.clssName',如果该类位于导入模块mymod中,则className.__module__等于mymodfromcommon.http_requestsimportHttpRequests#__module__:类定义所在模块print(Meeting.__module__)#__main__print(HttpRequests.__module__)#common.http_requestsMeeting类的路径为__main__,从common文件的http_requests文件中导入HttpRequests类,打印其路径。是common.http_requests5.__bases__:Getalltheparentclasscomponentsoftheclass获取一个类的所有父类元素(包含所有父类元素的元组)比如下面有一个Song类,继承了父类Music,得到的Song类的所有父类构成元素为:(,)classMusic(object):passclassSong(Music):passprint(Song.__bases__)#(,)总结在这篇文章中,我们介绍了面向对象的相关概念。这里简单总结一下:面向对象的相关概念:类和对象:类是一类事物,对象是这一类事物的具体实现,类具有相同的属性和行为;类的组成:类名、属性、方法,带对象的为新式类,不带对象的为经典类,获取或添加对象属性:hasattr:检查对象是否包含指定的属性或方法getattr:获取对象中指定属性的属性值setattr:为object对象的name属性设置指定值magicmethod:__init__()constructor:也叫初始化方法,用来初始化一些成员变量__del__()Destructor:每次一个object被调用,会执行__del__()方法,相当于Unittest框架中的tearDown__str()__string函数:返回一个字符串作为对象的描述信息Python内置属性:__dict__:获取对象的属性类,返回值为字典类型__doc__:获取类的文档字符串__name__:获取类名__module__:类定义所在的模块__bases__:获取类元素的所有父类,返回类型为元组