面向对象小技巧:本文根据b站黑马python类整理链接指引=>2022新版黑马程序员python教程1.初识对象时间在程序中可以像生活中一样使用对象来组织数据,设计表格、制作表格、填写表格的组织表格。在程序中设计一个表,我们调用:designclass(类)classStudent:name=None在程序中打印生产表,我们调用:createobject#createobjectbasedonclassstu1=Student()stu2=Student()在程序中填表,我们称之为:对象属性赋值stu1.name='111'stu2.name='111'二.成员方法2.1类的定义和使用语法:class是一个关键字,意思是定义一个类,类的属性,即类中定义的变量(成员变量),类的行为,即类中定义的函数(成员方法)。Object=类名()2.2成员变量和成员方法类中定义的属性(变量)被调用:成员变量类中定义的行为(函数)被调用:成员方法2.2.1成员方法定义语法def方法名(self,lineparameter1,...,lineparametern):methodbody可以看到,在方法定义的参数列表中,有一个:self关键字self关键字定义在成员方法时,是必填项.它用来表示类对象本身的含义。当我们使用类对象调用方法时,self会在方法内部被python自动传入。访问类的成员变量,必须使用selfdefsay_hi(self):print(f"Hieveryone,Iam{self.name}")注意:self关键字虽然在参数列表中,但是可以忽略传递参数时。3、类和对象基于类创建对象的语法:对象名=类名()4、构造方法Python类可以使用:__init__()方法,称为构造方法。可以实现:在创建类对象(构造类)时自动执行。在创建类对象(构造类)时,传入的参数会自动传递给__init__方法使用。在构造方法中定义成员变量,需要使用self关键字classStudent:def__init__(self,name,age,address):self.name=nameself.age=ageself.address=addressstu=Student('Everyday',30,'1111')case:学生信息录入#学生信息录入classStudent:id=Nonename=Noneage=Noneaddress=Nonedefinsert(self,id,name,age,address):self.id=idself.name=nameself.age=ageself.address=addressprint(f'学生{id}信息录入完成,信息为:[学生姓名:{name},年龄:{age},地址:{address}]')idx=10foriinrange(0,idx):print(f'当前输入第{i+1}个学生的学生信息,一共需要输入10个学生信息')name=input('请输入学生姓名:')age=input('请输入学生年龄:')address=input('请输入学生地址:')stu=Student()stu.insert(i+1,name,age,address)ifi+1==10:print('10个学生的信息dentshasbeenentered!')5.其他内置方法(魔术方法)上面学习的__init__构造方法是Python类的内置方法之一。这些内置的类方法各有其特殊的功能。我们调用这些内置方法:魔法方法方法函数__init__构造方法,可以用来设置创建类对象时的初始化行为__str__用来实现类对象转换字符串的行为__lt__用来比较2个类对象for小于或大于__le__用于比较2个类对象for小于等于或大于或等于__eq__用于比较2个类对象是否相等比较5.1__str__String方法的内存地址没有多少影响。我们可以通过__str__方法控制将类转换为字符串的行为。方法名:__str__返回值:字符串内容:自定义类记录:def__init__(self,date,order_id,money,province):self.date=date#orderdateself.order_id=order_id#orderIDself.money=money#订单金额self.province=province#销售省份def__str__(self):returnf"{self.date},{self.order_id},{self.money},{self.province}"5.2__lt__小于号比较方法(__gt__大于号比较法)直接比较两个对象是不允许的,但是在类中实现__lt__方法可以同时进行:小于号和大于号2种比较大于号的魔法sign方法为:__gt__但是,如果实现了__lt__,__gt__就不必实现了方法名:__lt__传入参数:other,另一个类对象返回值:TrueorFalse内容:自定义5.3__le__小于等于比较符号方法魔术方法:__le__可用于:<=、>=两个比较运算符器。方法名:__le__输入参数:other,另一个类对象返回值:TrueorFalse内容:自定义>=symbol实现的魔术方法是:__ge__但是,如果实现了__le__,则不需要__ge__5.4__eq__,比较运算符实现方法没有实现__eq__方法,可以比较对象,但是比较的是内存地址,即:不同的对象==比较一定是False的结果。实现了__eq__方法后,就可以根据自己的想法来判断两个对象是否相等了。方法名:__eq__传入参数:other,另一个类对象返回值:TrueorFalse内容:自定义六、封装面向对象封装的三大特点继承多态封装是指将现实世界的事物:属性行为封装成类,描述为:成员变量成员方法6.1私有成员由于真实的事物具有非公开的属性和行为,所以在程序中映射为真实事物的类也应该支持它们。该类以私有成员的形式提供支持。private成员变量privatemembermethod定义private成员的方式很简单,只需要:private成员变量:变量名以__开头(2个下划线)private成员方法:方法名以__(2个下划线)开头即可完成private的设置membersclassPhone:__is_5g_enable=False#私有成员变量def__check_5g(self):#私有成员方法print('5gon')练习:设计一个私有成员的手机#设计一个私有成员的手机importrandomclassPhone:__is_5g_enable=Falsedef__check_5g(self):ifself.__is_5g_enable:print('5gison')else:print('5gisoff,use4gnetwork')defcall_by_5g(self):self.__check_5g()print('调用...')phone:Phone=Phone()phone.call_by_5g()a=random.randint(1,2)7.继承什么是继承?继承是一个类继承另一个类的成员变量和成员方法语法:子类构建的类对象可以有自己的成员变量和成员方法使用父类的成员变量和成员方法单继承和多继承单继承:一个类继承另一个类类多重继承:一个类继承多个类,从左到右依次继承。在多重继承中,如果父类有同名的方法或属性,则第一个继承的优先级高于pass关键字。什么是functionpass是一个占位符语句,用来保证函数(方法)或类定义的完整性,意思是没有内容,空的意思7.1继承的基本语法7.1.1单继承类类名(父类名):class内容体继承分为:单继承和多继承使用如图所示的语法,就可以完成类的单继承。继承是指:成员变量和成员方法将从父类继承(复制)(不包括private7.1.2多继承一个类,可以继承多个父类类名(父类1,父类2,...。,parentclassn):Classcontentbody多重继承注意事项:如果多个父类中存在同名成员,默认以继承顺序(从左到右)为优先。即:先继承的保留,后继承的覆盖。unsatisfied”,那么就可以复制了。即:只需要在子类中重新定义同名的属性或方法即可。读入一个Record对象,封装成一个列表"""pass#读取文本文件classTextFileRead(FileReader):def__init__(self,path):self.path=path#定义文件路径#重写方法父类defread_file(self):print('11111')7.2.2调用父类的同名成员一旦父类的成员被覆盖,那么类对象调用成员时,就会调用被覆盖的新成员如果需要使用被覆盖的父类成员,需要特殊的调用方法:方法一:使用成员变量调用父类成员:父类名.成员变量使用成员方法:父类名。成员方法(self)方法二:使用super()调用父类成员使用成员变量:super().member变量使用成员方法:super()。membermethod()只能用在child类中,调用父类的同名成员。直接调用子类的类对象会调用子类的重写成员。8.类型注解8.1变量类型注解变量设置类型注解的基本语法:variable:type注意:元组类型设置类型详细注解,每个元素需要标出字典类型并设置类型详细注解。需要两种类型。第一个是关键,第二个是价值。除了使用variable:type,这种语法还用于注解,也可以在注解中进行类型注解。语法:#type:type8.2函数(方法)类型注解函数和方法形参类型注解语法:def函数方法名(参数名:type,形参名:type,.....):同时传递,函数(方法)的返回值也可以加上类型注解。语法如下:def函数方法名(形参名:type,形参名:type,...)->返回值类型:passdefread_file(x:int,y:int)->list[int]:pass8.3UniontypeUnion使用方法:importpackage:fromtypingimportUnionusage:Union[type,......,type]9.多态多态是指:多种状态,即完成某个时使用此行为,使用不同的对象将导致不同的状态。9.1抽象类(接口)这种设计的意思是:父类用来决定具体实现哪些方法,子类自己决定抽象类:包含抽象方法的类称为抽象类。抽象方法:方法体为空的实现(pass)称为抽象方法。抽象类的作用多用于顶层设计(设计标准),让子类具体实现。也是对子类的一种软约束,要求子类重写(实现)父类的一些方法,并以多态的方式使用它们,以获得不同的工作状态。十、案例数据分析案例main.py"""面向对象,数据案例分析"""frompyecharts.chartsimportLine,Barfrompyecharts.optionsimport*frompyecharts.globalsimportThemeTypefromfile_defineimportTextFileRead,JsonFileReader,FileReaderfromdata_defineimportRecordtext_file_reader=TextFileRead('./data/2011年1月销售数据.txt')json_file_reader=JsonFileReader('./data/2011年2月销售数据JSON.txt')jan_data:list[Record]=text_file_reader.read_file()feb_data:list[Record]=json_file_reader.read_file()#将两个月的数据合并为一个:#当前日期有记录,做累加data_dict[record.date]+=record.moneyelse:data_dict[record.date]=record.money#print(data_dict)#可视化图表开发bar=Bar(init_opts=InitOpts(theme=ThemeType.LIGHT))bar.add_xaxis(list(data_dict.keys()))bar.add_yaxis('Sales',list(data_dict.values()),label_opts=LabelOpts(is_show=False))bar.set_global_opts(title_opts=TitleOpts(title='DailySales'))bar.render('DailySalesecharts.html')file_defined.py"""和文件相关类定义"""importjsonfromdata_defineimportRecordclassFileReader:defread_file(self)->list[Record]:"""读取文件的数据,将读取的每条数据转换成一个Record对象,封装到list中"""pass#textfile读取类TextFileRead(FileReader):def__init__(self,path):self.path=path#定义文件路径#覆盖父类的方法defread_file(self)->list[Record]:f=open(self.path,'r',encoding="UTF-8")record_list:list[Record]=[]forlineinf.readlines():line=line.strip()#消除空格和换行data_list=line.split(',')record=Record(data_list[0],data_list[1],int(data_list[2]),data_list[3])record_list.append(record)#print(record_list)f.close()returnrecord_list#Json文件阅读类JsonFileReader(FileReader):def__init__(self,path):self.path=path#定义文件路径defread_file(self)->list[Record]:f=open(self.path,'r',encoding="UTF-8")record_list:list[Record]=[]forlineinf.readlines():data_dict=json.loads(line)record=Record(data_dict['date'],data_dict['order_id'],int(data_dict['money']),data_dict['province'])record_list.append(record)f.close()returnrecord_listif__name__=="__main__":text_file=TextFileRead('./data/2011年1月销售数据.txt')text_json=JsonFileReader('./data/2011年2月销售数据JSON.txt')list1=text_file.read_file()list2=text_json.read_file()forlinlist1:print(l)forlinlist2:print(l)data_defined.py"""数据定义类"""类记录:def__init__(self,date,order_id,money,province):self.date=date#orderdateself.order_id=order_id#订单IDself.money=money#订单金额self.province=province#销售省def__str__(self):returnf"{self.date},{self.order_id},{self.money},{self.province}”综上,以上就是面向python的对象,后续会持续更新。欢迎大家点赞关注~~
