当前位置:首页>python>笔记:python进阶(面向对象)

笔记:python进阶(面向对象)

  • 2026-08-24 11:29:26
笔记:python进阶(面向对象)

一,对象基础知识

1使用对象组织数据

步骤:
1设计类:在程序中设计表格
classstudent:
name=None
gender=None
native_place=None
age=None
Python
2创建对象,在程序中打印生成表格
stu_1=student()
Python
3对象属性赋值,在程序中填写表格
stu_1.name="张三"
stu_1.gender="男"
stu_1.native_place="北京"
stu_1.age=18
Python

二,类的成员方法

1类的定义与使用class

语法:class 类名称:
类的属性(定义在类中的变量)(成员变量)
类的行为 (定义在类中的函数)(成员方法)
创建类对象的语法:对象=类名称()
创建方法的语法:def 方法名(self,形参1………..形参N):
方法体
(虽然self在参数列表中,但是传参的时候可以忽略)
classstudent:
name=None
defsay_hi(self):
print(f"hello,my name is{self .name}")
defsay_hi2(self,msg):
print(f"hello,my name is {self .name},{msg}")
stu_1=student()
stu_1.name="peter"
stu_1.say_hi()
stu_1.say_hi2("look my eyes")
Python

三,内置方法(魔术方法)

1.构造方法__init__()

1构建类对象时,会自动执行
2构造类对象时,将传入参数自动传递给__init__方法使用
classstudent:
def__init__(self,name,age,tel):
self.name=name
self.age=age
self.tel=tel
print("student类创建一个类对象")
stu=student("张三",18,"123456")
Python
可以省略定义name=None的环节,在self.name会自动定义
当有输入时候
classstudent:
def__init__(self,name,age,adr):
self.name= name
self.age= age
self.adr= adr
for i inrange(1,11):
print(f"录入第{i}个学生信息:")
name=input("请输入学生姓名:")
age=int(input("请输入学生年龄:"))
adr=input("请输入学生地址:")
stu=student(name,age,adr)
print(f"学生{i}的姓名是{stu.name},年龄是{stu.age},地址是{stu.adr}")
Python

2字符串方法__str__

控制类转化为字符串的行为
直接输出类对象会显示内存地址
classstudent:
def__init__(self, name, age):
self.name = name
self.age = age
stu=student("xiaoming", 18)
print(stu)
print(str(stu))
Python
通过字符串方法进行转化
classstudent:
def__init__(self, name, age):
self.name = name
self.age = age
def__str__(self):
returnf"student类对象,name:{self.name}, age:{self.age}"
stu=student("xiaoming", 18)
print(stu)
print(str(stu))
Python
可以自己决定输出的结果是什么

3.小于符号的比较__it __

可以同时完成小于符合和大于符号两种的比较
classstudent:
def__init__(self, name, age):
self.name = name
self.age = age
def__lt__(self, other):
returnself.age < other.age
stu1=student('xiaoming', 18)
stu2=student('xiaohong', 17)
print(stu1
print(stu1>stu2)
Python
会返回true或false

4.小于等于比较符号方法__le__

classstudent:
def__init__(self, name, age):
self.name = name
self.age = age
def__le__(self, other):
returnself.age <= other.age
stu1=student('xiaoming', 17)
stu2=student('xiaohong', 17)
print(stu1<=stu2)
print(stu1>=stu2)
Python

5.比较运算符实现__eq__

如果不添加__eq__。使用==符号时,默认比较的是内存地址,结果必然是false
classstudent:
def__init__(self, name, age):
self.name = name
self.age = age
def__eq__(self, other):
returnself.age == other.age
stu1=student('xiaoming', 17)
stu2=student('xiaohong', 18)
print(stu1==stu2)
Python
使用eq才能进行比较

总结

四,封装

私有成员

内容:私有成员变量,私有成员方法
定义方法:
变量名加__开头(两个下划线)
classphone:
__current_V=None
def__keep_single_core(self):
print("让cpu以单核运行")
phone=phone()
phone.__keep_single_core()
Python
使用私有方法会报错
classphone:
__current_V=None
def__keep_single_core(self):
print("让cpu以单核运行")
phone=phone()
print(phone.__current_V)
Python
使用私有成员也同理
作用:
私有成员无法被类对象使用,但是可以被类中的其它成员使用
classphone:
__current_V=0.5
def__keep_single_core(self):
print("让cpu以单核运行")
defcall_by(self):
ifself.__current_V>=1:
print("打电话")
else:
self.__keep_single_core()
print("电量不足")
phone=phone()
phone .call_by()
Python

五,继承

(1)继承的基础语法

1单继承

class 类名(父类名):
类内容体
classphone:
IMEI=None
producer="HM"
defcall_by_4g(self):
print("calling by 4g")
classphone2022(phone):
face_id="10001"
defcall_by_5g(self):
print("calling by 5g")
phone=phone2022()
print(phone.producer)
phone.call_by_5g()
Python

2多继承

一个类可以继承好多个父类
classphone:
IMEI=None
producer="HM"
defcall(self):
print("正在打电话")
classNFCReader:
nfc_type="第五代"
producer="HM"
defread_card(self):
print("正在读取NFC卡")
defwrite_card(self):
print("正在写入NFC卡")
classremotocontrol:
rc_type="遥控器"
defcontrol(self):
print("正在控制")
classmyphone(phone,NFCReader,remotocontrol):
pass
phone=myphone()
phone.call()
phone.read_card()
phone.write_card()
phone.control()
Python
多继承中,如果有同名父类属性,先继承的优先级高于后继承

3 pass语句

如类中没有想要书写的语句,但是不书写会有语法报错,使用pass可以进行替代,表示空。

(2)复写

classphone:
IMEI=None
producer="SHA"
defcall(self):
print("正在打电话")
classMyphone( phone):
producer = "SXU"
defcall(self):
print("正在使用手机")
phone=Myphone()
phone.call()
Python

(3)调用父类同名成员

方式一:使用父类名调用
使用成员变量:父类名.成员变量
使用成员方法: 父类名.成员方法(self)
classphone:
IMEI=None
producer="SHA"
defcall_1(self):
print("正在打电话")
classMyphone( phone):
producer = "SXU"
defcall(self):
print("正在使用手机")
phone.call_1(self)
my_phone=Myphone()
my_phone.call()
Python

方式二:使用super()调用父类成员

使用成员变量:super().成员变量
使用成员方法:super().成员方法()
classMyphone( phone):
producer = "SXU"
defcall(self):
print("正在使用手机")
print(f"父类的属性为{super().producer}")
super().call_1()
phone=Myphone()
phone.call()
Python

六,多态

指的是多种状态:完成某个行为时,使用不同的对象会得到的不同状态
同样的行为(函数),传入不同的对象,得到不同的状态
以父类作定义,子类做工作,从而得到不同的工作状态
classAnimal:
defspeak(self):
pass
classDog(Animal):
defspeak(self):
print("Woof!")
classCat(Animal):
defspeak(self):
print("Meow!")
defmake_noise(animal):
animal.speak()
dog=Dog()
cat=Cat()
make_noise(dog)
make_noise(cat)
Python

1抽象类(接口)

包含抽象方法的类,没有具体的实现方法(pass)跳过
作用:用于做顶层设计,子类做具体实现
也是对子类的软性约束,要求子类必须复写(实现)父类的一些方法来配合使用
classAC:
defcool_wind(self):
pass
defhot_wind(self):
pass
defswing_1_r(self):
pass
classMidea_AC(AC):
defcool_wind(self):
print("Midea_AC: 冷风")
defhot_wind(self):
print("Midea_AC: TestHot")
defswing_1_r(self):
print("Midea_AC: 1_r")
classGeili_AC(AC):
defcool_wind(self):
print("Geili_AC: 冷风")
defhot_wind(self):
print("Geili_AC: TestHot")
defswing_1_r(self):
print("Geili_AC: 1_r")
defmake_cool(ac):
ac.cool_wind()
medeia_ac = Midea_AC()
geili_ac = Geili_AC()
make_cool(medeia_ac)
make_cool(geili_ac)
Python

七,类型注解

在代码中设计数据交互的地方,提供数据类型注解(显示说明)
功能:
1帮助第三方IDE工具(如pycharm)对代码进行类型推断,协助做代码提示
2帮助开发自身对变量进行类型注释

1变量的类型注解

1基础语法:  变量:类型
2注释中进行类型注解:#type:类型
但以上都为较为直观,在实际写程序中无需编写,但是以下情况是重要的运用场景
var_1:int=random.randint(0, 100)
var_2:dict=json.loads(data)
var_3:stuent=func()
Python

注意:类型注解仅仅是提示性的,不是决定性的。下面明显的错误也不会报错

var_1:int="itheima"
var_2:str=123
Python

2.函数(方法)类型注解

2.1形参类型注解

语法:

2.2返回值类型注解

deffunc(data:list)->list:
return data
Python

注意:类型注解仅仅是提示性的,不是决定性的。

3Union联合类型注解

需要先导包 from typing import Union
作用:包含多个类型时,进行联合注解
变量语法:
函数(方法)语法
eg:
from typing importUnion
my_list:list[Union[int,str]]=[1,2,3,"a","b","c"]
deffunc(data:Union[int,str])->Union[int,str]:
psss
func()
Python

八,综合案例:数据处理

步骤
1设计一个类,可以完成数据的封装
单独建立一个datadfine的文件
"""
数据定义的类
"""
classRecord:
def__init__(self,data,order_id,money,province):
self.date=data

日期

self.order_id=order_id

订单id

self.money=money

金额

self.province=province#省份
def__str__(self):
returnf"{self.date},{self.order_id},{self.money},{self.province}"
Python
2设计一个抽象类,定义文件读取的相关功能,并使用子类实现具体运用
单独建立一个file_define的文件
"""
和文件相关的类定义
"""
#定义一个抽象类做顶层设计,确定有哪些功能需要实现
from date_define import Record
from typing importList
import json
"""
定义一个抽象类做顶层设计,确定有哪些功能需要实现
"""
classFileReader:
defread_date(self)->List[Record]:
pass
classTextFileReader(FileReader):
def__init__(self,path):
self.path =path
defread_date(self) ->List[Record]:
f=open(self.path,"r",encoding="utf-8")
record_list=[]
for line in f.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)
f.close()
return record_list
classJsonFileReader(FileReader):
def__init__(self,path):
self.path =path
defread_date(self) ->List[Record]:
f=open(self.path,"r",encoding="utf-8")
record_list=[]
for line in f.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()
return record_list
if __name__ == "__main__":
text_file_reader=TextFileReader("D:/2011年1月销售数据.txt")
json_file_reader=JsonFileReader("D:/2011年2月销售数据JSON.txt")
list1=text_file_reader.read_date()
list2=json_file_reader.read_date()
for l in list1:
print(l)
for l in list2:
print(l)
Python
3在主文件中进行数据的整合
在main文件中
from file_define import FileReader,TextFileReader,JsonFileReader
from data_define import Record
text_file_reader=TextFileReader("D:/2011年1月销售数据.txt")
json_file_reader=JsonFileReader("D:/2011年2月销售数据JSON.txt")
jan_data:list[ Record]=text_file_reader.read_date()
feb_data:list[ Record]=json_file_reader.read_date()
all_date:list[ Record]=jan_data+feb_data
Python
4数据计算
data_dict={}
for record in all_data:
if record.date in data_dict:
data_dict[record.date]+=record.money
else:
data_dict[record.date]=record.money
print(data_dict)
Python
可以对每日的数据进行一个累加
4可视化表达
bar=Bar(init_opts=InitOpts(theme=ThemeType.LIGHT))
bar.add_xaxis(list(data_dict.keys()))
bar.add_yaxis("销售额",list(data_dict.values()),label_opts=LabelOpts(is_show=False))
bar.set_global_opts(title_opts=TitleOpts(title="每日销售数据"))
bar.render("每日销售数据.html")
Python

最新文章

随机文章