定义和使用类
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