我们可以通过 slots 属性来限制类实例的属性 只能绑定 slots 指定的属性。
自定义访问属性可以定义下面的方法来自定义类实例的属性方法的含义。
object.__getatter__ : 当属性查找到在通常的地方 没有找到属性时调用object.__getattribute__: 查找属性时 第一时间会调用该方法object.__setattr__ 设置属性方法时 调用该方法设置的属性object.__delattr__ 删除属性class Test: def __getattr__(self, item): print( 没有找到属性 触发 AttributeError 异常时会调用此方法 ) def __getattribute__(self, item): print( 没有设置属性 会调用此方法 ) object.__getattribute__(self, item) def __delattr__(self, item): print( 属性被删除了 ) object.__delattr__(self, item) def __setattr__(self, key, value): print( 查看属性 首先会进入该方法 ) object.__setattr__(self, key, value)习题
了解了python的内置属性之后 我们来做一道习题 方便我们更好的理解内置属性。
自定义一个类
1、对这个类创建的对象 进行属性限制 对象只能设置这个三个属性 title money data
2、通过相关机制对设置的属性类型进行限制 title只能设置字符串类型数据
money设置为int类型数据 data可以设置为任意类型
3、通过相关机制实现 data 属性不能进行删除
4、当money设置的值少于0时 确保查询出来的值为0
class MyClass(object):
__slots__ [ title , money , data ]
def __init__(self, title, money, data):
self.title title
self.money money
self.data data
def __getattr__(self, item):
return 类中未定义{}属性 .format(item)
def __setattr__(self, key, value):
# 判断 title 只能设置字符串
if key title :
if isinstance(value, str):
super().__setattr__(key, value)
else:
raise TypeError( title 属性只能设置字符串 )
# 判断 money 只能设置为 int
elif key money :
if isinstance(value, int):
super().__setattr__(key, value)
else:
raise TypeError( money 属性只能设置为 int )
else:
super().__setattr__(key, value)
def __getattribute__(self, item):
# 获取 money 属性
if item money :
value super().__getattribute__(item)
# 判断如果 money 的值小于0 则返回0
if value 0:
value 0
return value
return super().__getattribute__(item)
def __delattr__(self, item):
# 判断当 data 属性被删除时 raise 异常
if item data:
raise AttributeError( {0}属性不能被删除 .format(item))
super().__delattr__(item)


