写一个类,有个name属性,如果name赋值为非字符串,就不让放.

需求: 写一个类,有个name属性,如果name赋值为非字符串,就不让放.

# 提示: __setattr__, __getattr__, __delattr__系列都是点拦截属性(注意: 反射的本质也是通过点)
# 实现方式一:  __setitem__和__setattr__综合运用
"""
class Person:
    def __init__(self, name):
        self.name = name

    # __setitem__: 将`对象.属性=值`的操作构造成`对象['属性']=值`的这种字典的增值操作
    def __setitem__(self, key, value):
        setattr(self, key, value)

    # __setattr__: 添加/修改属性就会触发它的执行. (注意: 实例化是属性的添加)
    def __setattr__(self, key, value):
        if isinstance(value, str):
            self.__dict__[key] = value
        else:
            raise TypeError("对不起, 请输入字符串!")


# p = Person(111)  # TypeError: 对不起, 请输入字符串!

p = Person('egon')
p['name'] = 'lqz'
print(p.name)   # lqz
"""


# 实现方式二: 自定义错误类型 +
class NotStrTypeError(BaseException):
    def __init__(self, value):
        self.value = value
        super(NotStrTypeError, self).__init__()

    def __str__(self):
        return self.value


class Person:
    def __setattr__(self, key, value):
        if isinstance(value, str):
            # self.__dict__[key] = value
            super().__setattr__(key, value)
        else:
            raise NotStrTypeError('对不起, 请输入字符串类型')


p = Person()
try:
    p.name = 1
except NotStrTypeError as e:
    # e就是异常对象, 通过声明__str__方法, 实现打印对象展示异常的文本提示
    print(type(e), e)

posted @ 2020-07-07 16:46  给你加马桶唱疏通  阅读(121)  评论(0编辑  收藏  举报