# --------------------------------- 第三题(课中) ----------------------------------#
class Book:
prices = {'A':45.7,'B':56.7,'C':78.9,'D':67.8,'E':90.1}
shipping = {"包邮区":0,"一类地区":8,"二类地区":10,"特远地区":15}
def __init__(self,book_name,num,area):
self.book_name = book_name
self.num = num
self.area = area
def totals(self):
price = Book.prices.get(self.book_name)
ship = Book.shipping.get(self.area)
t = price * self.num + ship
return t
book_a = Book('A',2,'二类地区')
a_total = book_a.totals()
print("该买家来自{},此次消费的总金额是:{}".format(book_a.area,a_total))
# --------------------------------- 第五题(课中) ----------------------------------#
class SuperStudent:
def __init__(self,name,avg):
self.name = name
self.avg = avg
@classmethod
def by_grade(cls,name,**kwargs):
avg = sum(kwargs.values())/len(kwargs)
return cls(name,int(avg))
def get_info(self):
print('{}的平均成绩是{}分,请继续加油!'.format(self.name,str(self.avg)))
zhangyongchi = SuperStudent('张泳池',90)
zhangyongchi.get_info()
zhang = SuperStudent.by_grade('张泳池',语文=93,数学=98,python=89)
zhang.get_info()
# --------------------------------- 第六题(课中) ----------------------------------
# 创建一个类,当这个类实例化的时候,自动将数据集中的偶数和奇数分别用两个属性引用。判断一个数是奇数还是偶数,此方法与实例无关,所以在类中可以写成静态方法。
class JiOu:
def __init__(self,nums):
self.ji_odd = [i for i in nums if self.ji(i)]
self.ou_odd = [i for i in nums if i not in self.ji_odd]
@staticmethod
def ji(x):
if x % 2 == 1:
return True
return False
n = [1,2,3,4,5,6,7,8,9,10]
m = JiOu(n)
print(m.ji_odd)
print(m.ou_odd)
print(JiOu.ou_odd)
print(JiOu.ji_odd)
# --------------------------------- 第七题(课中) ----------------------------------
# 创建类SchoolKid,初始化小孩的姓名、年龄,并且有访问和修改属性的方法。然后创建类ExaggeratingKid,继承类SchoolKid,子类中覆盖父类中访问年龄的方法,并将实际年龄增加2。
class SchoolKid:
def __init__(self,name,age):
self.name = name
self.age = age
def get_name(self):
return self.name
def get_age(self):
return self.age
class ExaggeratingKid(SchoolKid):
def get_age(self):
return (self.age + 2)
kid = ExaggeratingKid('刘崇华',3)
print(kid.get_name())
print(kid.get_age())
# --------------------------------- 第八题(课后) ----------------------------------
# 创建一个时间类,利用这个类创建时间实例,可以通过实例的方式实现如下功能:
# (1)输出格式为"hh:mm:ss"的当前实例化的时间。
# (2)计算实例化的时间与方法参数提供的其他时间之间的时间差(可以用正负表示相对实例化的时间的早晚)。
import datetime
class Time:
def __init__(self,start_time,stop_time):
self.start_time = datetime.datetime.strptime(start_time,"%Y-%m-%d%H:%M:%S")
self.stop_time = datetime.datetime.strptime(stop_time,"%Y-%m-%d%H:%M:%S")
def times(self):
time = self.stop_time - self.start_time
return time
t = Time('2021-04-2120:30:21','2021-04-2123:21:09')
print(t.start_time)
print(t.stop_time)
print(t.times())
# --------------------------------- 第九题(课后) ----------------------------------
# 写一个关于名人名言的类,每个实例都按照类似如下的格式输出名人名言。
# (1)子曰:学而时习之,不意乐乎。
# (2)李白:安能摧眉折腰事权贵,使我不得开心颜。
class Famous:
def __init__(self):
self.famous_name = 0
self.famous_words = 0
def __getattr__(self, item):
if item == 'contain':
return "{}:{}".format(self.famous_name,self.famous_words)
else:
raise AttributeError
def __setattr__(self, item, value):
self.__dict__[item] = value
f = Famous()
f.famous_name = "子曰"
f.famous_words = "学而时习之,不意乐乎。"
print(f.contain)
# --------------------------------- 第十题(课中) ----------------------------------
# 创建计算支付金额的类PayCalculator,拥有属性pay_rate,表示每天的薪资数额。方法compute_pay计算某段时间内应支付的薪资。
# --------------------------------- 第十一题(课中) ----------------------------------
# 编写一个商品销售的类,必须具有的属性:销售数量、商品零售单价、商品批发折扣百分比、商品起批数量,并且拥有如下方法:记录商品销售数量,商品销售总额。
# --------------------------------- 第十二题(课中) ----------------------------------
# 某书店买书,每本书的价格固定,并且从不打折。编写一个类,实现如下功能:
# (1)书名和价格的映射关系是固定的,作为类属性。
# (2)以书名作为实例化的参数。
# (3)调用实例方法,计算出购书应该支付的总额。
# --------------------------------- 第十三题(课中) ----------------------------------
# 对Foo类进行改造,实现如下操作:
#(1)可对类属性__name进行访问和修改
#(2)使用装饰器函数的方式实现(1)
# --------------------------------- 第十四题(课中) ----------------------------------
# 定义一个类字典对象,包括__setitem__、__getitem__、__len__、__delitem__这些特殊方法。
class UpDict:
def __init__(self,k,v):
self.dct = dict([(k, v)])
def __setitem__(self, k, v):
self.dct[k] = v
def __getitem__(self, k):
return self.dct[k]
def __len__(self):
return len(self.dct)
def __delitem__(self, k):
del self.dct[k]
d = UpDict('name','liuchonghua')
d['lang'] = 'python'
d['city'] = 'suining'
print(d['city'])
print(len(d))
del d['city']
print(d.dct)
# --------------------------------- 第十五题(课中) ----------------------------------
# 对类RoundFloat进行改写,在原有基础上实现加法和乘法的方法。
class RoundFloat:
def __init__(self,val):
self.value = round(val,2)
def __str__(self):
return "{0:.2f}".format(self.value)
def __call__(self, n, m):
return (self.value + n,self.value * m)
__repr__ = __str__
r = RoundFloat(3.1)
print(r)
print(r(5,3))
# --------------------------------- 第十六题(课中) ----------------------------------
# 编写一个迭代器,通过循环语句,实现对某个正整数的依次递减1,直到0。
class MyRange:
def __init__(self,n):
self.i = n
def __iter__(self):
return self
def __next__(self):
if self.i >= 0:
i = self.i
self.i -= 1
return i
else:
raise StopIteration
print("MyRange(10):",[i for i in MyRange(10)])
# --------------------------------- 第十七题(课中) ----------------------------------
# 对于多层列表,如[1 ,2, [3, 4, [5, 6], 7], 8, 9],现在需要将它扁平化,即如同展开一个单层列表那样。写一个函数实现此功能。(提示:可以使用yield from语句)
g = [1, 2, [3, 4, [5, 6], 7], 8, 9]
def generator():
yield from g[:2]
yield from g[2][:2]
yield from g[2][2][:] #yield from iterable本质上等于for item in iterable
yield g[2][3] #yield 接受值并返回
yield from g[3:]
for x in generator():
print(x)
# --------------------------------- 第十八题(课中) ----------------------------------
# 在内置对象类型中,列表、字典、元组等都是"容器",在标准库的collections模块中有Sequence类,它能支持容器的常用操作。请使用collections.Sequence类定义一种新的容器,要求容器中的对象必须按照一定顺序排列。
from collections.abc import Sequence
class NewSequence(Sequence):
def __init__(self, total):
self.num = [None] * total
def __setitem__(self, key, value):
self.num[key] = value
def __getitem__(self, key):
return self.num[key]
def __len__(self):
l = len(self.num)
return l
def __reversed__(self):
lst = sorted(self.num, reverse=True)
return lst
print(dir(NewSequence))
n = NewSequence(3)
print(n.num)
n[0] = 2
n[1] = 8
n[2] = 1
print(n.num)
print(n[1])
s_n = n.__reversed__()
print(s_n)
类(课堂作业参考答案)
于 2021-04-28 17:54:32 首次发布