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'