python-14-描述符应用和类的装饰器

209 阅读1分钟

上下文管理协议

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__)