习题
自定义一个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=name
self.price=price
self.identify=identify
def 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=name
self.price=price
self.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=name
self.price=price
def 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本书
这里面除了汉字其他都会动态变化 所以这些东西必然也是用变量来代替的
@staticmethod
def 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 List
from collections import Counter
class Book():
identify='人民出版社'
def __init__(self,name,price):
self.name=name
self.price=price
@classmethod
def get_identify(cls):
return cls.identify
def get_total_price(self,num):
total_price=num*self.price
return '打印%s本%s书共%s元'%(num,self.name,total_price)
@staticmethod
def 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本书