python第七章学习笔记

定义和使用类

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值