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

习题

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值