上下文管理协议
class Feng_Open:
def __init__(self,name):
self.name = name
def __enter__(self):
print('执行enter')
return self
def __exit__(self, exc_type, exc_val, exc_tb):
print('执行exit')
#异常
print(exc_type,exc_val,exc_tb)
return True
with Feng_Open('a.txt') as f:
print(f)
print(1/0)
print('+++++++++++++')
print('+++++++++++++')
print('+++++++++++++')
print('ffffffffffffffffffff')
描述符应用
class Typed:
def __init__(self,key,expected_type):
self.key = key
self.expected_type = expected_type
def __get__(self, instance, owner):
print('get方法--%s--%s' %(instance,owner))
return instance.__dict__[self.key]
def __set__(self, instance, value):
print('set方法-%s---%s'%(instance,value))
if not isinstance(value,self.expected_type):
# print('你传入的类型不是字符串,请修改错误')
# return
raise TypeError('%s传入的类型不是%s'%(self.key,self.expected_type))
instance.__dict__[self.key]=value
def __delete__(self, instance):
print('delete')
instance.__dict__.pop(self.key)
#name属性被数据描述符代理
class People:
name = Typed('name',str)
age = Typed('age',int)
def __init__(self,name,age,salary):
self.name = name
self.age = age
self.salary = salary
p1 = People('fengfeng',18,100)
#类属性>数据描述符>实例属性>费数据描述符>不存在
p1.name = 'xiaorong'
print(p1.name)
print(p1.__dict__)
del p1.name
print(p1.__dict__)
# xiaoming
# {'name': 'xiaoming', 'age': 18, 'salary': 100}
# delete
# {'age': 18, 'salary': 100}
类的装饰器
# def method1(obj):
# print('------------')
# #进行操作
# obj.name='feng'
# return obj
# # @method1
# # def test():
# # print('test')
# # test()
# @method1
# class Feng:
# pass
# print(Feng.__dict__)
def Typed(**kwargs):
def deco(obj):
for key,val in kwargs.items():
setattr(obj,key,val)
return obj
return deco
@Typed(name='fengfeng')
class Feng:
pass
print(Feng.__dict__)