定义和使用类
class person: def say(self): print("Hello") p=person() p.say() class lei: qw="123" er="456"#公有变量 __ty='110'#__***表示私有变量 __t="private" def pt(self): print(self.qw) print(self.er) print(self.__ty) print(self.__t) l=lei() l.pt()构造函数: def init(self): 析构函数: def del(self):
class lei: def __init__(self): self.qw="123" self.er="456" self.__ty='110' self.__t="private" def pt(self): print(self.qw) print(self.er) print(self.__ty) print(self.__t) def __del__(self): print("end") l=lei() l.pt()静态方法: 静态方法无法传入self参数,无法访问实例变量 可以直接通过类名访问
class My: var="String 1" @staticmethod def a(): print("I am a static method") m=My m.a()继承 派生类和基类的同名方法
class Citizen: def __init__(self,id,name,age): self.id=id self.name=name self.age=age def __del__(self): print('bye') def show(self): print(self.id,self.name,self.age,end="") class Student(Citizen): def __init__(self,id,name,age,studentid,ca,grade): super(Student,self).__init__(id,name,age) self.studentid=studentid self.ca=ca self.grade=grade def show(self): super(Student,self).show() print(self.studentid,self.grade,self.ca,end="") class Teacher(Citizen): def __init__(self,id,name,age,workid,xibie,wage): super(Teacher,self).__init__(id,name,age) self.workid=workid self.xibie=xibie self.wage=wage def show(self): super(Teacher,self).show() print(self.workid,self.xibie,self.wage,end="") def d(): c=Citizen(1234567,"zhang",90) c.show() del c t=Teacher(123,45,67,89,00,10000) t.show() del t d()抽象类和多态
from abc import ABCMeta,abstractmethod class Picture(object): __metaclass__=ABCMeta @abstractmethod def draw(self):pass class line(Picture): def __init__(self,x1,y1,x2,y2): self.x1=x1 self.y1=y1 self.x2=x2 self.y2=y2 def draw(self): print('Draw line:(%d,%d,%d,%d)'%(self.x1,self.y1,self.x2,self.y2)) class Circle(Picture): def __init__(self,x,y,r): self.x=x self.y=y self.r=r def draw(self): print('Draw Circle:(%d,%d,%d)'%(self.x,self.y,self.r)) def f(): c=Circle(1,2,10) l=line(3,4,5,6) ls=[] ls.append(c) ls.append(l) for i in range(len(ls)): ls[i].draw() f() #Draw Circle:(1,2,10) #Draw line:(3,4,5,6)运算符重载
class F: def __init__(self,x,y): self.x=x self.y=y def __add__(self, o): return self.x+o.x,self.y+o.y def __sub__(self,o): return self.x-o.x,self.y-o.y def __mul__(self,o): return self.x*o.x,self.y*o.y def __le__(self,o):#比较两个对象是否相等 return (self.x==o.x and self.y==o.y) def __lt__(self,o):#比较两个对象的大小 return (self.x>o.x) f=F(1,2) d=F(3,4) print(f+d) print(f-d) print(f==d) print(f!=d) #(4, 6) #(-2, -2) #False #True class F: def __init__(self,x,y): self.x=x self.y=y def __str__(self):#对输出进行重载,在调用print时发挥作用 return '(%s,%s)'%(self.x,self.y)#注意格式化输出,只能输出字符串类型 f=F(1,2) d=F(3,4) print(f) print(d) #(1,2) #(3,4)除法重载
class F: def __init__(self,x,y): self.x=x self.y=y def __truediv__(self, other): return self.x/other.x, self.y/other.y f=F(1,2) d=F(3,4) print(f/d) #(0.3333333333333333, 0.5)练习题 (1)设计一个日期类,它包括年、月、日三个实例成员变量,其中年设计为私有的,编写构造方法、年月日的显示方法及修改年值的方法,最后编写主模块定义其对象,赋值为当前日期,对对象的值进行修改并显示对象结果。
class Day: def __init__(self,year,month,day): self.__year=year self.month=month self.day=day def show(self): print(self.__year,'年',self.month,'月',self.day,'日') def change(self,a): self.__year=a d=Day(2019,7,18) d.show() d.change(2018) d.show() #2019 年 7 月 18 日 #2018 年 7 月 18 日(2)编写一个圆类,它包括表示半径的变量、构造方法、修改半径的方法、显示半径的方法以及计算圆面积的方法;然后继承圆类再编写一个圆柱体派生类,它包括表示高度的变量、构造方法、修改半径和高度的方法、显示半径和高度的方法以及计算圆柱体体积的方法。最后编写主模块定义这两个类的对象,并进行适当的赋值,对对象的值进行修改并显示对象的结果
from math import * class Circle: def __init__(self,r): self.r=r def show(self): print('圆的半径为:',self.r) def Area(self): return pi*self.r*self.r class CZ(Circle): def __init__(self,r,h): super(CZ,self).__init__(r) self.h=h def changer(self,r): self.r=r def changeh(self,h): self.h=h def show(self): print("圆柱的半径和高分别为",self.r,self.h) def V(self): return self.r*self.r*self.h*pi cz=CZ(1,2) cz.show() print(cz.V()) cz.changeh(3) cz.show() cz.changer(2) cz.show() #圆柱的半径和高分别为 1 2 #6.283185307179586 #圆柱的半径和高分别为 1 3 #圆柱的半径和高分别为 2 3(3)由屏幕输入一些学生信息,包括学号、姓名、性别、班级。用pickle方式保存, 然后将所有人的信息读出来,按学号从小到大显示,一行显示一个人的信息。
import pickle with open('d:\\message.txt','wb') as f: data={} n=int(input('请输入要输入的学生数:')) for i in range(0,n): id=int(input('学号')) data[id]=[] name=input("姓名:") data[id].append("姓名:"+name) sex=input("性别:") data[id].append("性别:"+sex) c=input("班级:") data[id].append("班级:"+c+'班') pickle.dump(data,f) with open('d:\\message.txt','rb') as f: s=pickle.load(f) for i in sorted(s): print(i,s[i])请输入要输入的学生数:3 学号4 姓名:cdj 性别:女 班级:23 学号1 姓名:qwe 性别:男 班级:23 学号2 姓名:qyf 性别:男 班级:44 1 [‘姓名:qwe’, ‘性别:男’, ‘班级:23班’] 2 [‘姓名:qyf’, ‘性别:男’, ‘班级:44班’] 4 [‘姓名:cdj’, ‘性别:女’, ‘班级:23班’] 问题(4)一个列表由若干整数构成,编写函数删除其中素数元素。
def sushu(n): if(n==1): return False if(n==2): return True else: for i in range(2,n): if(n%i==0): return False return True l=[1,2,3,4,5,6,7,8,9,10] for i in range(len(l)): if(i<len(l)-1): if(sushu(l[i])): l=l[0:i]+l[i+1:] else: if(sushu(i)): l=l[0:i] print(l) #[1, 3, 4, 6, 8, 9, 10](5)编写函数,求两个正整数的最小公倍数。
def m(a,b): if(a<b): a,b=b,a if(a%b==0): return a else: i=a+1 while i>a: if(i%a==0 and i%b==0): return i else: i=i+1 print(m(17,3))(6)录入二个学生的成绩,把该学生的成绩转换成A:优秀、B:良好、C:合格、D:及格的形式,最后将该学生的成绩打印出来。要求使用assert断言处理分数不合理的情况。
def change(n): try: assert n>0 and n<=100,'成绩应在0到100之间' if(n>90): return 'A' elif(n>80): return 'B' elif (n > 70): return 'C' elif (n > 60): return 'D' else: return 'E' except Exception as e: print(e) n=int(input('n=')) print(change(n))(7)现在许多显示器的屏幕宽度和高度的比例是16:9。讨论显示器的尺寸讲的是对角线长度,单位是英寸。现编写程序,输人显示器的尺寸,单位英寸,计算并输出显示器的宽度和高单位为厘米。1英寸(in)=2.54厘米(cm)
from math import * def change(l): t=sqrt(l**2/337)#256*t**2+81*t**2=l**2 return t*2.54