""" 特性 property 类方法 classmethed 静态方法 staticmethed """
property
封装逻辑,让调用者感受不到逻辑 , property不可以赋值
class Room(object): #property 特性 def __init__(self,name,owner,width,length,heigh): self.name = name self.owner=owner self.width = width self.length = length self.heigh = heigh def cal_area(self): print(self.width*self.length) @property def cal_areaw(self): return self.width*self.length n1 = Room('yy','wc',10,10,10) n1.cal_area() print (n1.cal_areaw) #100 print(n1.name) #yy
import math class Circle: def __init__(self,radius): self.radius = radius @property def area(self): return math.pi * self.radius**2 #计算面积 @property def perimeter(self): return 2*math.pi*self.radius #计算周长 c=Circle(10) print(c.radius) print(c.area) print(c.perimeter) c.area(33) #不可以赋值
不可以赋值
Traceback (most recent call last): File "D:/python/pythontest/练习2/10.py", line 85, in <module> c.area(33) TypeError: 'float' object is not callable
classmethed
class Room(object): #类方法 tag = 1 def __init__(self,name,owner,width,length,heigh): self.name = name self.owner=owner self.width = width self.length = length self.heigh = heigh def cal_area(self): print(self.width*self.length) @classmethod def tell_info(cls): #cls 是 类名 print(cls) print(cls.tag) # n1 = Room('yy','wc',10,10,10) Room.tell_info() # 结果 # <class '__main__.Room'> # 1
staticmethod
class Room(object): #静态方法 staticmetched #静态方法只是名义上归类管理, 不能使用类变量和实例变量 是类的工具包 tag = 1 def __init__(self,name,owner,width,length,heigh): self.name = name self.owner=owner self.width = width self.length = length self.heigh = heigh @staticmethod def wash_body(a,b): print("%s %s正在洗澡" %(a,b)) @staticmethod def test(): print('66666666666') Room.wash_body(2,3) #2 3正在洗澡 Room.test() #66666666666
组合
class Hand: pass class Foot: pass class Trunk: pass class Head: pass class Persion: def __init__(self,id_num,name): self.id_num = id_num self.name = name self.hand = Hand() self.foot = Foot() self.trunk = Trunk() self.head = Head() p1 = Persion('1111','alex') print(p1.__dict__) #{'id_num': '1111', 'name': 'alex', 'hand': <__main__.Hand object at 0x00000000025A35F8>, 'foot': <__main__.Foot object at 0x00000000025A3630>, 'trunk': <__main__.Trunk object at 0x00000000025A36A0>, 'head': <__main__.Head object at 0x00000000025A3710>}
class School: def __init__(self,name,addr): self.name = name self.addr = addr class Course: def __init__(self,name,price,period,school): self.name = name self.price = price self.period = period self.school = school s1 = School('oldboy','北京') s2 = School('oldboy','南京') s3 = School('oldboy','东京') c1 = Course('linux',10,'1h',s1) print(c1.__dict__) #{'name': 'linux', 'price': 10, 'period': '1h', 'school': <__main__.School object at 0x00000000025A3550>} print(c1.school) #<__main__.School object at 0x00000000025A3550> print(s1) #<__main__.School object at 0x00000000025A3550> print(c1.school.addr) # 北京
class School: def __init__(self,name,addr): #学校名 地址 self.name = name self.addr = addr def zhao_sheng(self): print('%s 正在招生'%self.name) class Teacher: def __init__(self,name,price,school): #老师名 老师工资 学校名 self.name = name self.price = price self.school = school class Student: def __init__(self,name,school,teach): #学生名 学校名 老师名 self.name = name self.school = school self.teach = teach class Course: def __init__(self,name,price,period,school,teach,student): #科目名 学费 时间 学校名 老师名 学生名 self.name = name self.price = price self.period = period self.school = school self.teach = teach self.student = student sch1 = School('oldboy','北京') sch2 = School('oldboy','南京') sch3 = School('oldboy','东京') t1 = Teacher('august','3w',sch1) t2 = Teacher('yangyang','6w',sch1) stu1 = Student('st_name1',sch1,t1) stu2 = Student('st_name2',sch2,t2) # # c1 = Course('py','1w','3mount',sch1,t1,stu1) # c2 = Course('py','1w','3mount',sch2,t2,stu2) msg=''' 学校: 1 老男孩 北京校区 2 老男孩 南京校区 3 老男孩 东京校区''' msg1=''' 老师: 1 august 2 yangyang ''' msg2=''' 学生: 1 q1 2 q2 ''' while True: print(msg) menu = { '1':sch1, '2':sch2, '3':sch3, } menu1 = { '1':t1, '2':t2 } menu2 = { '1':stu1, '2':stu2 } school = input('学校名>>> ') school = menu[school] print(msg1) teach = input('老师名>>> ') teach = menu1[teach] print(msg2) student = input('学生名>>> ') student = menu2[student] name = input('课程名 >>> ') price = input('学费 >>> ') period = input('学习时间 >>> ') course_object = Course(name,price,period,school,teach,student) print("科目%s 学费%s 时间%s 学校%s 老师%s 学生%s"%(name,price,period,course_object.school.name,course_object.teach.name,course_object.student.name))
继承 封装 多态
继承
''' 单继承 多继承 '''
class Dad: money = 10 def __init__(self,name): self.name = name def play(self): print('%s 打麻将'%self.name) class Son(Dad): pass print(Son.money) #10 print(Son.__dict__) #{'__module__': '__main__', '__doc__': None} print(Dad.__dict__) #{'__module__': '__main__', 'money': 10, '__init__': <function Dad.__init__ at 0x00000000025A12F0>, 'play': <function Dad.play at 0x00000000025A1400>, '__dict__': <attribute '__dict__' of 'Dad' objects>, '__weakref__': <attribute '__weakref__' of 'Dad' objects>, '__doc__': None} s = Son('yw') s.play() #yw 打麻将
''' 子类继承父类的所有属性,子类自定义的属性如果和父类重名,那子类就用自己改写的, 不会覆盖父类的属性 '''
''' 什么时候用继承 1.当类之间有显著不同,并且较小的类是较大的类所需要的组件时, 用组合 2.当类之间有很多相同的功能, 提取这些共同的功能做成成基类,用继承比较好 '''
''' 继承的两种用途 一:继承基类的方法,并且做出自己的改变或者扩展(代码重用):实践中,继承的这种用途意义并不很大,甚至常常是有害的。因为它使得子类与基类出现强耦合。 二:声明某个子类兼容于某基类,定义一个接口类(模仿java的Interface),接口类中定义了一些接口名(就是函数名)且并未实现接口的功能,子类继承接口类,并且实现接口中的功能 ''' ''' # 声明某个子类兼容于某个基类, 定义一个接口类: 子类继承接口类, 并实现接口中定义的方法 # 接口继承 归一化 '''
接口继承
import abc class All_file(metaclass=abc.ABCMeta): @abc.abstractmethod def read(self): pass @abc.abstractmethod def write(self): pass class Disk(All_file): def read(self): print('disk read') def write(self): print('disk write') class Cdrom(All_file): def read(self): print('cdrom read') def write(self): print('cdrom write') class Mem(All_file): def read(self): print('mem read') def write(self): print('mem write') # m1=Mem() m1.read() m1.write()
继承
class Vehicle: Country='China' def __init__(self,name,speed,load,power): self.name=name self.speed=speed self.load=load self.power=power def run(self): print('开动啦') class Subway(Vehicle): def __init__(self,name,speed,load,power,line): Vehicle.__init__(self,name,speed,load,power) # super(Subway,self).__init__(name,speed,load,power) # super().__init__(name, speed, load, power) self.line=line def show_info(self): print(self.name,self.speed,self.load,self.power,self.line) def run(self): Vehicle.run(self) #super().run() print('%s %s 线,开动啦' %(self.name,self.line)) line13=Subway('北京地铁','10km/s',1000000000,'电',13) line13.show_info() line13.run()