class Room: tag = 12 def __init__(self,name,owner,width,length,heigh): self.name = name self.owner = owner self.width = width self.length = length self.heigh = heigh @property def cal_area(self): print('%s住的%s总面积是%s'% (self.owner,self.name,self.width * self.length)) return self.width * self.length @classmethod def tell_info(cls,x): print(cls) print('------->',cls.tag) print(x) @staticmethod def wash_body(a,b,c): print('%s正在洗澡'%a) #静态方法: # r1 = Room('厕所','alex',100,100,100000) # r2 = Room('公共厕所','AA',1,1,1) # print(r1.cal_area) #加 property之后可执行函数 静态属性 # print(r2.cal_area) # r1.cal_area() #类方法 # Room.tell_info(10) #实例也可以用 #静态方法 名义上属于类管理 实际上不可调用类属性和实例属性 Room.wash_body('AA','BB','CC') r2 = Room('公共厕所','AA',1,1,1) r2.wash_body('a','BBB','CCC') # print(Room.__dict__)
#总结
# 静态属性:函数作为数据属性形式 调用时感受不到内在逻辑
# 既可以访问实例属性 也可以访问雷属性
# 类方法:可以访问数据属性 也可以访问函数属性
# 但是不可以访问实例属性
# 静态方法:不能访问类属性 也不能访问实例属性
子类:
class School: def __init__(self,name,addr): self.name = name self.addr = addr class Course: def __init__(self,name,period,price,school): self.name = name self.period = period self.price = price self.school = school s1 = School('北大','beijing') s2 = School('复旦','shanghai') c1 = Course('linux','1 h','10 dollor',s1) print(c1.school.name)
while True: menu ={ '1':s1, '2':s2, '3':s3 } choice = input('>>: ') school_obj = menu[choice] name = input('namae:') price = input('') new_course = input() print('课程[%s]属于[%s]学校'%(Course,School)) #low 比解决方案 class Course: def __init__(self,name,price,period,school): class School: def __init__(self, name, addr): #... self.name = name self.Course_list = [] s1.Course_list.append(c1) s1.Course_list.append(c2) for Course_obj in s1.Course_list: print(Course_obj.name)
面向对象的三大特征:继承 多态 封装
类的继承:
class Pclass1:
class Pclass2:
class SubClass(Pclass1):
子类继承父类所有属性 但若重名 并不改变父类属性
当类显著不同 且较小类是较大类所需组件 用组合比较好
当有很多相同特征 提取相同功能做基类 用继承
含义2 某子类兼容于某基类 定义一个接口类 子类继承接口类
并且继承接口中定义的方法
MRO列表的构造遵循三条准则:
1 子类会优先于父类被检查
2 多个父类会根据他们在列表总的顺序被检查
3 如果对下一个类存在两个合法的选择 选择第一个父类
新式类:广度优先 python3
经典类:深度优先 python2