属性访问机制和元类练习

# !/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)
原文地址:https://www.cnblogs.com/momoon/p/12953727.html