习题
自定义一个Book类:该类有:
一个类属性:identify,人民出版社
有两个对象属性:name,price
一个类方法:get_identify
一个对象方法:get_total_price(num):打印'xx本xx书共xx元'.
一个静态方法:packing(*books)
静态方法(包装)的思路:
A_book=Book('计算机类',50)
B_book=Book('英语类',35)
C_book=Book('数学类',42)
D_book=Book('数学类',38)
调用Book.packing()打印:一箱装了2本数学类1本英语类1本计算机类共4本书
class Book:
pass
A_book=Book('计算机类',50)
B_book=Book('英语类',35)
C_book=Book('数学类',42)
D_book=Book('数学类',38)
print(Book.get_identify())
print(C_book.get_total_price(5))
Book.packing(A_book,B_book,C_book,D_book)
_________
输出结果为:
人民出版社
5本数学类书一共210元
一箱装了1本计算机类1本英语类2本数学类共4本书
==========================================
总结
1,类属性应该在内部申明, 而且不能写在定义内的参数内,会报错
class Book():def __init__(self,identify='人民出版社',name,price):#尝试直接在定义参数时直接赋值类属性self.name=nameself.price=priceself.identify=identifydef get(self):print(self.identify)A_book=Book('计算机类',50)A_book.get()
会提示这样的错误SyntaxError: non-default argument follows default argument
非默认实参跟随默认实参 应该是不能这样做
然后换了一种方法
class Book():def __init__(self,identify,name,price):self.name=nameself.price=priceself.identify='人民出版社'#在这里赋值def get(self):print(self.identify)A_book=Book('计算机类',50)A_book.get()
报错Book.__init__() missing 1 required positional argument: 'price'
这时候少了一个参数 计算机类给了identify,50给了name price没有人给
但是给定一个类的时候只有两个参数 显然这样不对
其实类属性直接在类内部 像给一个变量赋值那样即可
然后用cls(代表这个类)来访问它即可
class Book():identify='人民出版社'def __init__(self,name,price):self.name=nameself.price=pricedef get(cls):print(cls.identify)A_book=Book('计算机类',50)A_book.get()
结果
为啥?这里加不加@classmethod我都得到了结果
人民出版社
2.这个题目里面的难点就是 怎么把 ‘一箱装了2本数学类1本英语类1本计算机类共4本书’ 这句话弄出来
一箱装了2本数学类1本英语类1本计算机类共4本书
想一下 这里哪些是变的,哪些是不变的
写出来是这样
一箱装了x本one类y本two类z本three类共sum本书
这里面除了汉字其他都会动态变化 所以这些东西必然也是用变量来代替的
@staticmethoddef packing(*books):lis=list()for i in books:lis.append(i.name)dictA=Counter(lis)total_num=sum(dictA.values())shu=''for k,v in dictA.items():shu=shu+'%s本%s'%(v,k)print('一箱装了%s共%s本书'%(shu,total_num))
我的思路是
首先定义一个空列表 用它来装这一箱(*books)所有的书名
然后利用Counter()函数,这时候返回一个字典,key就是书名,那么value就是书的数量。就得到了每本书的个数
再来打印 一箱装了 x本one类y本two类z本three类 共sum本书这句话
1. 一箱装了 可以直接打印出来
2. 共sum本书 sum就是Counter返回的字典的值的和 利用sum(dictA.values())即可得到
3. 中间部分 A本B类 重复出现 考虑利用for循环
%s本%s类%(value,key) 插入后 就是value本key类 和上面Counter()返回的字典刚好对应上
所以只要用for遍历一遍Counter()返回的字典的键—值对(dict.items)就好了
完整代码
from typing import Listfrom collections import Counterclass Book():identify='人民出版社'def __init__(self,name,price):self.name=nameself.price=price@classmethoddef get_identify(cls):return cls.identifydef get_total_price(self,num):total_price=num*self.pricereturn '打印%s本%s书共%s元'%(num,self.name,total_price)@staticmethoddef packing(*books):lis=list()for i in books:lis.append(i.name)dictA=Counter(lis)total_num=sum(dictA.values())shu=''for k,v in dictA.items():shu=shu+'%s本%s'%(v,k)print('一箱装了%s共%s本书'%(shu,total_num))A_book=Book('计算机类',50)B_book=Book('英语类',35)C_book=Book('数学类',42)D_book=Book('数学类',38)print(Book.get_identify())print(C_book.get_total_price(5))Book.packing(A_book,B_book,C_book,D_book)
结果
人民出版社打印5本数学类书共210元一箱装了1本计算机类1本英语类2本数学类共4本书