《Python核心编程》第13章 习题

本篇内容涉及Python类的定制,包括浮点转金额类、用户数据库管理类、堆栈类以及电子商务引擎相关类的设计。用户数据库类在初始化时加载用户信息,支持添加和更新操作,并在对象销毁时保存数据。堆栈类包含push、pop和isempty方法。另外,设计了User、Item和Cart类构建电子商务引擎,模拟顾客、商品和购物车的关系。最后,介绍了Message、User和Room类,用于构建一个包含多用户和房间的聊天系统。
摘要由CSDN通过智能技术生成

13-3.对类进行定制。写一个类,用来将浮点型值转换为金额。

class MoneyFmt(object):
    def __init__(self,value=0.0,flag='-'):
        self.mvalue = float(value)
        self.flag = flag
        
    def dollarize(self):
        val = round(self.mvalue,2)
        strvalue = str(val)
        pos = strvalue.find('.')
        while (pos-3)>0:
            strvalue = strvalue[:pos-3]+','+strvalue[pos-3:]
            pos -= 3
        if strvalue.startswith('-'):
            return self.flag+'$'+strvalue[1:]
        else:
            return '$'+strvalue
        
    def update(self,newvalue=None):
        if newvalue is not None:
            self.mvalue = float(newvalue)
            
    def __nonzero__(self):
        if (self.mvalue == 0):
            return False
        else:
            return True
        
    def __str__(self):
        return self.dollarize()

    def __repr__(self):
        return repr(self.mvalue)
13-4.用户注册。

建立一个用户数据库类,来管理一个系统,该系统要求用户在登录后才能访问某些资源。这个数据库类对用户进行管理,并在实例化操作时加载之前保存的用户信息,提供访问函数来添加或更新数据库的信息。在数据修改后,数据库会在垃圾回收时将新信息保存到磁盘。

from datetime import datetime
import shelve,os

class userdatabase(object):
    def __init__(self,dbfile):
        self.db = {}
        if os.path.exists(dbfile):
            self.db = shelve.open(dbfile, 'c')
        self.dbfile = dbfile
        self.flag = False

    def __del__(self):
        data = shelve.open(self.dbfile, 'c')  
        data.update(self.db)  
        data.close()

    def login(self,user,pwd):
        if not self.db.has_key(user):
            self.flag = False
        elif self.db[user][0] == pwd:
            self.db[user][1] = datetime.now()
            self.flag = True

    def deluser(self,user):
        if self.flag:
            self.db.pop(user)
        else:
            print 'login first'

    def updateuser(self,user,pwd):
        if self.flag:
            self.db[user] = [pwd,datetime.now()]
        else:
            print 'login first'

    def listall(self):
        if self.flag:
            for user in self.db:
                print user, self.db[user][0], self.db[user][1]
        else:
            print 'login first'

if __name__=='__main__':
    user = userdatabase("shelve.data")
    user.login('root','root')
    user.updateuser('test1','test1')
    user.updateuser('test2','test2')
    user.listall()
13-5.几何。创建一个由有序数值对(x,y)组成的Point类,代表某个点的X和Y坐标。
class point(object):
    def __init__(self,x=0,y=0):
        self.x = x
        self.y = y

    def __str__(self):
        return '(%d,%d)' %(self.x,self.y)

if __name__=='__main__':
    p = point(3,4)
    print p
13-6.几何。创建一个直线类,除主要属性:一对坐标值外,它还具有长度和斜线属性。你需要覆盖__repr__()方法,使得代表那条直线的字符串表示形式是由一对元组构成的元组。
from math import sqrt

class Line(object):
    def __init__(self,x1=0,y1=0,x2=1,y2=0):
        self.x1 = x1
        self.y1 = y1
        self.x2 = x2
        self.y2 = y2
        self.length = 0
        self.slope = 0

    def getLength(self):
        if (self.x1 == self.x2) and (self.y1 == self.y2):
            self.length = 0
        elif (self.x1 == self.x2):
            self.length = abs(self.y2-self.y1)
        elif (self.y1 == self.y2):
            self.length = abs(self.x2-self.x1)
        else:
            self.length = sqrt((self.y2 - self.y1)**2 + (self.x2 - self.x1)**2)
        return self.length

    def getSlope(self):
        if self.length == 0:
            self.slope = None
        elif (self.x1 == self.x2) or (self.y1 == self.y2):
            self.slope = None
        else:  
            self.slope = float(self.y2 - self.y1) / (self.x2 - self.x1)  
        return self.slope

    def __str__(self):
        return '((%d,%d),(%d,%d))' %(self.x1,self.y1,self.x2,self.y2)

    __repr__ = __str__

if __name__=='__main__':
    l = Line(1,2,1,4)
    print l
    print 'length is %f ' %l.getLength()
    print 'slope is %s ' %l.getSlope()
13-7.数据类。提供一个time模块的接口,允许用户按照自己给定的时间格式来查看日期。你的类应该维护一个日期值,并用给定的时间创建一个实例,如果没有给出时间值,程序执行时会默认采用当前的系统时间。 

import time

class TimeFormat(object):
    def __init__(self,t=time.time()):
        self.mytime = t

    def update(self,t=time.time()):
        self.mytime = t

    def display(self,ft=None):
        fmt = {}
        fmt['MDY'] = '%m/%d/%y'
    
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值