资讯动态

Python基础 -- 面向对象高级

发布时间:2026/9/11 17:51:52 来源:尧图企业网站定制
一、封装1、封装把数据属性和操作数据的函数方法捆绑在一起形成一个 独立的单元类并隐藏内部的实现细节私有只对外暴露必要的功能方法公共。外部调用者无需关心内部的实现只需要通过公开接口来操作对象即可。2、公共属性 / 方法创建类对象后可以直接调用类中的属性和方法3、私有属性 / 方法只能在类的内部使用私有属性在初始化名之前加2个下划线私有方法在方法名之前加两个下划线ps :python中没有真正的私有机制约定在私有属性名和方法名前加两个_ _下划线 class Car: def __init__(self,brand,model,color,owner): self.brand brand # 公有属性 self.model model # 公有属性 self.color color # 公有属性 self.__owner owner # 私有属性 def start(self): # 公有方法 print(f{self.brand}{self.model}准备开始行驶....) def run(self): # 公有方法 print(f{self.brand}{self.model}正在行驶.....) self.control_fuel() # 私有方法只在内部调用 def stop(self): # 公有方法 print(f{self.brand}{self.model}准备制动.....) def __control_fuel(self): # 私有方法 print(f{self.brand}{self.model}正在控制油门) car1 Car(BWM,x5,黑色,乔乔) #print(car1.owner)报错因为owner是私有属性4、如果想在类外调用私有属性方法1可以加公用的get方法返回私有属性的值由公用的方法返回私有值class Car: def __init__(self,brand,model,color,owner): self.brand brand # 公有属性 self.model model # 公有属性 self.color color # 公有属性 self.__owner owner # 私有属性 def start(self): # 公有方法 print(f{self.brand}{self.model}准备开始行驶....) def run(self): # 公有方法 print(f{self.brand}{self.model}正在行驶.....) self.control_fuel() # 私有方法只在内部调用 def stop(self): # 公有方法 print(f{self.brand}{self.model}准备制动.....) def __control_fuel(self): # 私有方法 print(f{self.brand}{self.model}正在控制油门) def get_owner(self): return self.__owner car1 Car(BWM,x5,黑色,乔乔) print(car1.get_owner)方法21个下划线 类名 私有属性名class Car: def __init__(self,brand,model,color,owner): self.brand brand # 公有属性 self.model model # 公有属性 self.color color # 公有属性 self.__owner owner # 私有属性 def start(self): # 公有方法 print(f{self.brand}{self.model}准备开始行驶....) def run(self): # 公有方法 print(f{self.brand}{self.model}正在行驶.....) self.control_fuel() # 私有方法只在内部调用 def stop(self): # 公有方法 print(f{self.brand}{self.model}准备制动.....) def __control_fuel(self): # 私有方法 print(f{self.brand}{self.model}正在控制油门) def get_owner(self): return self.__owner car1 Car(BWM,x5,黑色,乔乔) print(car1._Car__owner)5、在类外调用私有方法也可以用上述方法二class Car: def __init__(self,brand,model,color,owner): self.brand brand # 公有属性 self.model model # 公有属性 self.color color # 公有属性 self.__owner owner # 私有属性 def start(self): # 公有方法 print(f{self.brand}{self.model}准备开始行驶....) def run(self): # 公有方法 print(f{self.brand}{self.model}正在行驶.....) self.control_fuel() # 私有方法只在内部调用 def stop(self): # 公有方法 print(f{self.brand}{self.model}准备制动.....) def __control_fuel(self): # 私有方法 print(f{self.brand}{self.model}正在控制油门) def get_owner(self): return self.__owner car1 Car(BWM,x5,黑色,乔乔) car1._Car__control_fuel()二、继承1、 继承描述的是两个类之间的关系子类继承父类就可以得到父类的非私有的属性和方法。ps所有类都有一个父类object父类class 类名方法1方法2子类class 类名父类名passclass FuelCar(Car): pass class ElectricCar(Car): pass if __name__ __mian__: car2 FuelCar(Bwm,X5,黑色张三) car2.start() car2.run() car2.stop() print(car2.get_owner)2、重写子类继承父类后子类可以去重新定义父类的共有方法方法名相同如果要在子类中调用重写前父类的方法可以用以下方式父类名.方法名self/ super. 方法名class Car: def __init__(self,brand,model,color,owner): self.brand brand # 公有属性 self.model model # 公有属性 self.color color # 公有属性 self.__owner owner # 私有属性 def start(self): # 公有方法 print(f{self.brand}{self.model}准备开始行驶....) def run(self): # 公有方法 print(f{self.brand}{self.model}正在行驶.....) self.control_fuel() # 私有方法只在内部调用 def stop(self): # 公有方法 print(f{self.brand}{self.model}准备制动.....) def __control_fuel(self): # 私有方法 print(f{self.brand}{self.model}正在控制油门) def get_owner(self): return self.__owner def charge(self): print(f{self.brand}{self.model}正在补充燃料...) class FuelCar(Car): def charge(self): super.charge(self) print(f{self.brand}{self.model}正在加油...) class ElectricCar(Car): def charge(self): Car.charge(self) print(f{self.brand}{self.model}正在充电...) if __name__ __mian__: car2 FuelCar(Bwm,X5,黑色张三) car2.charge() car3 ElectricCar(Bwm,iX5,黑色张三) car3.charge()3、多继承一个子类同时继承了多个父类的情况继承多个父类中的非私有属性和方法class 子类名父类名1父类名2父类名3......class Car: def __init__(self,brand,model,color,owner): self.brand brand # 公有属性 self.model model # 公有属性 self.color color # 公有属性 self.__owner owner # 私有属性 def start(self): # 公有方法 print(f{self.brand}{self.model}准备开始行驶....) def run(self): # 公有方法 print(f{self.brand}{self.model}正在行驶.....) self.control_fuel() # 私有方法只在内部调用 def stop(self): # 公有方法 print(f{self.brand}{self.model}准备制动.....) def __control_fuel(self): # 私有方法 print(f{self.brand}{self.model}正在控制油门) def get_owner(self): return self.__owner def charge(self): print(f{self.brand}{self.model}正在补充燃料...) class HuaWeiAiDriving: def __init__(self,version V1.0): self.version version def run(self): print(f使用华为AI智能驾驶系统{self.version}正在行驶...) class WenJieCar(Car,HuaWeiAiDriving) pass if __name__ __mian__: c WenJieCar(Bwm,IX5,黑色,张三)注意当一个类继承了多个父类时默认优先使用第一个父类中的同名属性或方法可以使用下面的方法查看调用顺序比如上面的例子 c WenJieCar(Bwm,IX5,黑色,张三)的几个属性都是Car的HuaWeiAiDriving的/version属性无法调用类名._ _mro_ _属性 或 类名.mro ( )如果要调用每个父类中的属性和方法就需要和调用父类重写的方法一样父类名.方法名super.方法名 #只能调用第一个类中的属性class Car: def __init__(self,brand,model,color,owner): self.brand brand # 公有属性 self.model model # 公有属性 self.color color # 公有属性 self.__owner owner # 私有属性 def start(self): # 公有方法 print(f{self.brand}{self.model}准备开始行驶....) def run(self): # 公有方法 print(f{self.brand}{self.model}正在行驶.....) self.control_fuel() # 私有方法只在内部调用 def stop(self): # 公有方法 print(f{self.brand}{self.model}准备制动.....) def __control_fuel(self): # 私有方法 print(f{self.brand}{self.model}正在控制油门) def get_owner(self): return self.__owner def charge(self): print(f{self.brand}{self.model}正在补充燃料...) class HuaWeiAiDriving: def __init__(self,version V1.0): self.version version def run(self): print(f使用华为AI智能驾驶系统{self.version}正在行驶...) class WenJieCar(Car,HuaWeiAiDriving) def __init__(self,brand,model,color,owner,version V1.0): super.__init__(brand,model,color,owner) #super只是第一个类中的属性 HuaWeiAiDriving.__init__(self,version) def run(self): Car.run(self) HuaWeiAiDriving.run(self) if __name__ __mian__: c WenJieCar(Bwm,IX5,黑色,张三) c1 WenJieCar(奥迪,A6,黑色,张三,V1.1) c.run()ps如果用super.__init__brand,model,color,owner只写属性名用HuaWeiAiDriving.__init__(self,version)必须把self传递进来因为super会自动帮你把self传递进来而类名.方法名只是普通函数不会帮你传参二、多态1、多态指同一个方法具有不同的形态、行为、表现def 方法名参数名类名 #方法中的参数是一个类类型的参数ps参数名类名的写法用到的是类型注解不懂可以看看我之前的一篇专门写了“类型注解”2、多态参数类型为父类支持掺入任意子类就比如下面的代码handle_charge的参数是Car类型的而Car有FuelCar和ElectricCar的2个子类class Car: ..... def charge(self): print(正在补充燃料...) class FuelCar(Car): def charge(self): print(燃油车正在加油...) class ElectricCar(Car): def charge(self): print(电动汽车正在充电...) def handle_charge(car:Car): car.charge() handle_charge(FuelCar(Bwm,x5,白色500“张三”)) #燃油车正在加油... handle_charge(ElectricCar(BYD,汉,白色,500,张三)) #电动汽车正在充电...同一调用语句传入对象不同触发形态不同3、鸭子类型 如果一个东西走路像鸭子叫起来也像鸭子那它就是鸭子·在鸭子类型中我们关注的是对象的行为它有啥方法而不是对象的类型它是什么类class Duck: def __init__(self,name,age): self.name name self.age age def swimming(self): print(f{self.age}岁的{self.name}正在游泳....) class Pig: def __init__(self,name,age): self.name name self.age age def swimming(self): print(f{self.age}岁的{self.name}正在游泳....) class Dog: def __init__(self,name,age): self.name name self.age age def swimming(self): print(f{self.age}岁的{self.name}正在游泳....) def go_swimming(duck:Duck): duck.swimming() if __name__ __main__: go_swimming(Duck(唐老鸭,4)) #4岁的唐老鸭正在游泳.... go_swimming(Pig(猪,2)) #2岁的猪正在游泳.... go_swimming(Dog(小狗,4)) #4岁的小狗正在游泳....我们可以看到传入的参数是Duck类的类类型但是Duck和PigDog之间并没有继承关系但是依旧可以调用go_swimming重写方法得出结论python中的多态是不依赖继承体系。这就是python多态中的鸭子类型只要方法中有swimming就可以调用。三、抽象类抽象类是一种只能被继承不能被实例化的类作用规定子类必须要实现哪些方法强制子类必须遵守统一的代码规范pspython中的抽象类需要继承 abc 模块中的 ABCAbstract Base Class类并在子类中用abstractmethod装饰抽象方法。from abc import ABC,abstractmethod # abstractmethod装饰的方法在子类中实现四、案例某社区图书馆需要开发一个简单的图书管理系统系统需要支持会员登陆、图书借阅、图书归还等功能。系统中有两种类型的会员普通会员和VIP会员他们的借书权限不同。你需要使用面向对象编程的思想设计并实现这个图书管理系统核心功能1、会员登陆会员通过卡号和密码登陆系统2、借书会员可以借阅库存中有余量的书3、还书会员可以归还借阅的书4、查看我的借阅展示当前会员已经借阅的图书列表5、退出系统借阅规则1、普通会员最多可以借阅3本2、VIP会员最多可借6VIP等级本VIP等级默认为1。例如VIP等级为1时最多可借7本VIP等级为2时最多可借8本以此类推。VIP等级越高可借阅的图书数量越多这也是VIP会员相比普通会员的核心优势之一。注意1、登陆成功卡号和密码均正确后才可以访问系统2、图书库存不足或者当前会员借书数量达到最大借书数量不能再借新书from abc import ABC,abstractmethod import json class Books: def __init__(self,book_id,title,author,total_num): self.book_id book_id self.title title self.author author self.__availble_num total_num #初始可用数量等于总数量 #借书 def borrow_book(self): if self.__availble_num 0: self.__availble_num - 1 return True return False #还书 def back_book(self): self.__availble_num 1 def get_avaible_num(self): return self.__availble_num # 继承ABC的都被定义为抽象类 class Members(ABC): def __init__(self,card_id,name,password): self.card_id card_id #会员卡号 self.name name #会员姓名 self.__password password #会员密码 self.__borr_book [] #会员借阅的书籍 #会员借书规则普通会员和vip会员借书规则不同用子类继承的方法 def borrow(self,book:Books): if len(self.__borr_book) self.get_Max_book(): if book.borrow_book(): self.__borr_book.append(book) print(f{self.name}已成功借阅书籍{book.title}) else: print(借阅书籍已达到最大或此书籍已被借完) #会员还书 def back(self,book:Books): #判断会员是否借阅了书籍 if book in self.__borr_book: book.back_book() self.__borr_book.remove(book) print(f{self.name}已经成功归还图书) else: print(您没有借阅这本图书) #抽象方法子类必须重写get_Max_book()方法 abstractmethod def get_Max_book(self): pass def get_borr_book(self): return self.__borr_book def get_password(self): return self.__password #子类会员 class Vip_Member(Members): def __init__(self,card_id,name,password,step): super().__init__(card_id,name,password) self.step step def get_Max_book(self): return 6self.step class Normal_Member(Members): def get_Max_book(self): return 3 class Library_System: def __init__(self): self.books {} #图书馆的所有书籍books.jsonbooks的key是编号value是Books对象 self.members {} #图书馆的所有会员member.json,members的key是会员卡号value是Members对象 self.current_member None #当前登录的会员 #加载数据 self.get_books() self.get_members() #加载书籍信息 def get_books(self): #读取books.json文件中的数据 #with‑as 上下文管理器优势自动关闭文件无需手动 close () #open()函数打开文件参数1文件路径参数2打开模式参数3编码格式 #as f 将打开的文件对象赋值给变量 f with open(data/book.json,r,encodingutf-8) as f: #json.load()函数将json格式的数据转换为Python对象 - 加载文件 #由于我们books.json的文件是列表格式所以book_data是一个列表 book_data json.load(f) #列表中每个元素是一个字典所以book就是一个一个的字典 for book in book_data: self.books[book[编号]] Books(book[编号],book[标题],book[作者],book[数量]) print(加载数据信息成功) #加载会员信息 def get_members(self): with open(data/member.json,r,encodingutf-8) as f: member_data json.load(f) #member就是一个一个的member.json列表中的字典 for member in member_data: #卡号的字符串开头是N就是普通会员 if member[卡号].startswith(N): self.members[member[卡号]] Normal_Member(member[卡号],member[姓名],member[密码]) elif member[卡号].startswith(V): self.members[member[卡号]] Vip_Member(member[卡号],member[姓名],member[密码],member[会员等级]) print(加载会员信息成功) #登陆 def login(self): print(登陆中...) while True: member_id input(请输入会员卡号) password input(请输入密码) if member_id in self.members: #self.members[member_id]是Members的实例对象调用Members中的get_password()方法获取密码 member self.members[member_id] if password member.get_password(): self.current_member member print(f登陆成功欢迎您,{member.name}) return True else: print(密码错误,登陆失败) continue else: print(会员卡号不存在) continue def borr_books(self): #展示所有书籍信息 for book in self.books.values(): print(f书籍编号{book.book_id}\t书籍标题{book.title}\t书籍作者{book.author}\t书籍剩余数量{book.get_avaible_num()}) #借阅书籍 id input(请输入你要借阅的书籍编号) if id in self.books: book_bor self.books[id] self.current_member.borrow(book_bor) print(f书籍{book_bor.title}剩余数量为{book_bor.get_avaible_num()}) else: print(书籍编号不存在) def back_books(self): #展示所有书籍信息 for book in self.books.values(): print(f书籍编号{book.book_id}\t书籍标题{book.title}\t书籍作者{book.author}\t书籍剩余数量{book.get_avaible_num()}) #归还书籍 id input(请输入你要归还的书籍编号) if id in self.books: book_back self.books[id] self.current_member.back(book_back) else: print(书籍编号不存在) def show_borr_books(self): #展示当前会员借阅的书籍信息 borr_books self.current_member.get_borr_book() if borr_books: print(f{self.current_member.name}已借阅的书籍有) for book in borr_books: print(f书籍编号{book.book_id}\t书籍标题{book.title}\t书籍作者{book.author}) else: print(您未借阅任何书籍) def run(self): if self.login(): while True: print(1.借书\t 2.还书\t 3.查看借阅书籍\t 4.退出\t) a int(input(请输入你要进行的操作)) match a: case 1: self.borr_books() continue case 2: self.back_books() continue case 3: self.show_borr_books() continue case 4: break case _: print(输入有误请重新输入) continue if __name__ __main__: ls Library_System() ls.run()

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价