类(课堂作业参考答案)

1 篇文章 0 订阅
# ---------------------------------  第三题(课中)  ----------------------------------#
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)
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

juicy-hua

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值