@property、关联关系、继承、多继承
1.@property使用来修饰属性的,将属性私有化改为公有化,但是可以设置属性条件
格式:
class Person: def __init__(self,name,age): self.name = name self.age = age @property def age(self): return self.age @age.setter def age(self,age): if age >0 and age <100: self.age = age else: print('不属于正常范围!') def __str__(self): return '{}今年{}岁!'.format(self.name,self.age) p = Person('张三',20)#创建对象 p.age = 25 p.__str__()#结果为张三今年25岁!
2.关联关系分为两种:一种是has a关系,另外一种是is a关系
3.has a关系是指一个类包含另外一种类,或者另外几种类
class Road: def __init__(self,r_name,l): self.r_name = r_name self.l = l class Car: def __init__(self,c_name,speed): self.c_name = c_name self.speed = speed def get_time(self,road):#调用Road类的对象,以及方法 t = road.l//self.speed return '{}在{}行驶了{}小时'.format(self.c_name,road.r_name,t) def __str__(self): return '车名:{},时速:{}'.format(self.c_name,self.speed) r = Road('106国道',336) c = Car('奥迪',100) print(c.get_time())#结果为奥迪在106国道上面行驶了3小时 print(c.__str__())#结果为车名:奥迪 时速100
4.is a其实就是继承的关系,子类继承父类
格式子类名(父类名):
class Person: def __init__(self,num,name,salary):#初始化方法 self.num = num self.name = name self.salary = salary def get_num(self):#获取工号方法 return self.num def get_name(self):#获取年龄方法 return self.name def set_name(self,name):#设置姓名方法 self.name = name def get_salary(self): return self.salary def __str__(self):#查看员工的所有信息 return '工号为{}的员工{},薪资为{}'.format(self.num,self.name,self.salary) #定义子类Worker类 class Worker(Person): def __init__(self,hours,h_salary): super().__init__()#调用父类的方法,通过super().方法名 self.hours = hours self.h_salary = h_salary def get_salary(self):#重写父类方法 salary += hours*h_salary return self.salary w = Worker(101,'张三',3000,200,15) print(w.get_salary)#结果为6000#无需重写父类方法,可以共用 print(w.get_num())#结果,101 w.set_name('张小三')#无需重写父类方法,可以共用 print(w.__str__())#结果为员工号为101的员工张小三,薪资6000 #直接调用父类的__str__()
5.多继承:就是一个子类可以继承多个父类
python2使用的是经典类:深度优先
python3使用的是新式类:广度优先:从左至右,深度优先
#新式类 class P1(object): def foo(self): print('p1----->foo') def bar(self): print('p1----->bar') class P2(object): def foo(self): print('p2----->foo') def bar(self): print('p2----->bar') class C1(P1,P2): pass class C2(P1,P2): def foo(self): print('c2----->bar') class D(C1,C2): pass d = D() d.foo()#结果为p1----->foo d.bar()#c2----->bar '''解析: 1)D类对象继承C1,C2类,C1,C2类都继承P1,P2类,P1,P2类都继承 object类 2)当对象d在调用foo方法时,先去自身的类中寻找方法,发现没有,再去 由左到右的父类C1中去找,发现C1类中也并没有,就去父类C2中调用,发现没有该方法,就去C2父类P1中寻找发现有foo方法,故打印p1----->foo 3)当对象d在调用bar方法时,先去自身的类中寻找方法,发现没有,再去 由左到右的父类C1中去找,发现C1类中也并没有,就去父类C2中调用,发现有该方法,故打印C2----->bar 4)如果是经典类的话,在P1,P2类中没有父类object 它的继承调用是D类没有找C1类,C1类没有找C1父类P1类 如果在没有就找C2,P2,符经典类打印结果为p1----->foo,p1----->bar '''
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
· 零经验选手,Compose 一天开发一款小游戏!