1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > 类属性 类方法 对象方法 静态方法

类属性 类方法 对象方法 静态方法

时间:2019-05-14 11:44:32

相关推荐

类属性 类方法 对象方法 静态方法

习题

自定义一个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本书

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。