写一个类,有个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)