# python 上下文管理协议 描述符 # /usr/sbin/py/python # -*-coding:utf8-*- class Open: def __init__(self,name): self.name = name def __enter__(self): print("execute enter") return self def __exit__(self, exc_type, exc_val, exc_tb): print("execute exit") with Open("a.txt") as f: # 指 with as 这种写法 print("---------") print(f.name) pass # 自动触发类中的 enter方法,方法结束后会触发exit方法 # with 代码块如果出现异常 会直接执行exit方法 # 描述符 # 数据描述符:至少实现了 get,set方法 # 非数据描述符:没有set方法 # 优先级 类属性》数据描述符》实例属性》非数据描述符》找不到的属性除非__getattr__()方法 # 通过属性描述符来限制变量类型 # 声明一个数据描述符 class StrType: def __init__(self,key,paramType): self.key = key self.paramType = paramType def __get__(self, instance, owner): print("get",instance,owner) return instance.__dict__[self.key] def __set__(self, instance, value): if isinstance(value,self.paramType): instance.__dict__[self.key] = value else: # print("传入数据类型错误不是字符串",value) raise TypeError("传入数据类型错误不是字符串",value) # return def __delete__(self, instance): instance.__dict__.pop(self.key) class Person: name = StrType("name",str) age = StrType("age",int) salary = StrType("salary",float) def __init__(self,name,age,salary): self.name = name self.age =age self.salary =salary p1 = Person("jake",10,33.5) print("=================>",p1.__dict__) print(p1.name) # p2 = Person(1,2,3) # print(p2.__dict__)