属性访问机制和元类练习
# !/usr/bin/env python3 # -*- coding: utf-8 -*- # @Time : 2020/5/24 23:06 # @Author : "小多肉" # @Email : 1021181701@qq.com # @File : 属性访问机制和元类.py # @Software: PyCharm """TODO: 第一题、自定义一个类 1、通过上课的相关知识点对这个类创建的对象,进行属性限制,对象只能设置这个三个属性: title money data 2、通过相关机制对设置的属性类型进行限制,title只能设置字符串类型数据 money设置为int类型数据 data可以设置为任意类型 3、通过相关机制实现,data 属性不能进行删除 4、当money设置的值少于0时,确保查询出来的值为0, """ print('-------------------第一题--------------------') class AttrCtrl(object): __slots__ =['title','money','data'] def __setattr__(self, key, value): if key == 'title': if isinstance(value,str): super().__setattr__(key,value) else: raise AttributeError('title只能设置字符串类型数据') elif key == 'money': if isinstance(value,int): super().__setattr__(key,value) else: raise AttributeError('money只能设置为int类型数据') else: super().__setattr__(key,value) def __getattribute__(self, item): if item == 'money': value = super().__getattribute__(item) if value < 0: return 0 else: return value else: return super().__getattribute__(item) def __delattr__(self, item): if item == 'data': raise AttributeError('data不能删') else: super().__delattr__(item) a = AttrCtrl() a.money = 71 print(a.money) a.money = -1 a.title = 'ppp' a.data = 10 print(a.money) print(a.data) print(a.title) try: del a.data except AttributeError as e: print(e) try: a.title = 666 except AttributeError as e: print(e) try: a.name = 2 # 报错,不存在 except AttributeError as e: print(e) """ 第二题: 有一艘船上有40个人,由于触礁出现了漏水,现在船上最多只能载20个人,需要20个人下船。 于是这40个人排成一队,根据站位,每个人领取了一个编号,从1开始到40。 然后从1开始到9进行循环报数,报数为9的人出列下船,一直循环,直到船上只剩下20人。 示例:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19....40 第一次报到9下船的人,编号为9(1,2,3,...编号为9的人报9) 第二次下船的,编号为18,(10的人报1....18的人报9) 第三次下船的,编号为27 (19的人报1....27的人报9) 第四次下船,编号为36 (28的人报1....36的人报9) 第五次下船,编号为5 (37的人报1,38报2,39报3,40报4....5的人报9) 第六次下船,编号为15 ..... 请问最后那些编号的人下船了? """ print('---------------第二题----------------------') li = [i for i in range(1,41)] leave = [] while len(li) > 20: leave.append(li[8]) li = li[9::] + li[:8] print("最后编号为以下列表中的人下船了:") print(leave)