2018-07-17-Python全栈开发day28-描述符应用与类的装饰器-part1

1.上下文管理协议

  在对文件进行处理也是实例化的过程,在用with打开文件时,会直接出发open函数中的enter方法,在with函数调用结束后,会直接exit方法

  根据一切皆对象,除了open类之外,自己也可以自定义类,来自定义根据enter和exit完成特定的目的

  

class Test:
    def __init__(self,name):
        self.name=name
    def __enter__(self):
        print('this is enter')
        return self#返回一个值给f
    def __exit__(self, exc_type, exc_val, exc_tb):
        print('this is exit')
        print(exc_type,'exctype')#在代码块内如果有一场的话,会将异常类型,异常值,追踪信息返回
        print(exc_val,'val')
        print(exc_tb,'tb')
with Test('a') as f:#此时出发enter
    print('start opening')#在with内执行代码
print('this is end')#with内代码执行完,执行exit代码,接着执行本段代码

2.描述符的应用

  利用描述符以及描述符的优先级,来给用户输入的值进行类型检测#传入的值必须是字符串,否则报错

  2.1 错误示范

    

class Fun:
    def __init__(self,name,age,gender):#name为字符串,age为数字,gender为字符串
        self.name=name
        self.age=age
        self.gender=gender
    def show(self):
        print(self.name,self.age,self.gender)
p1=Fun('100','yehaibin','male')
p1.show()#并不能对输入的类型进行限制
#其他解决方法:直接str或者int

  2.2使用描述符来进行自定义

  

#利用描述符以及描述符的优先级,来给用户输入的值进行类型检测#传入的值必须是字符串,否则报错
#实例化的时候,如果错了,在调用时提醒
#对值进行设置的时候,如果错了,则提醒,get和set
class Name_Str:
    def __init__(self,key):
        self.key=key
    def __get__(self, instance, owner):#instance是传来的实例,
        # print(instance)
        return instance.__dict__[self.key]
    def __set__(self, instance, value):
        if isinstance(value,str):
            # type(self.key) == str:
            instance.__dict__[self.key] = value
        else:
            print('your input %s is wrong,please input an str' %self.key)
    def __delete__(self, instance):
        pass
class Age_Int:
    def __init__(self,key):#key为‘’age
        self.key=key
    def __get__(self, instance, owner):#instance是传来的实例,
        # print(instance)
        return instance.__dict__[self.key]
    def __set__(self, instance, value):
        if isinstance(value,int):
            # type(self.key) == str:
            instance.__dict__[self.key] = value
        else:
            print('your input %s is wrong,please input an int' %self.key)
    def __delete__(self, instance):
        pass

class Fun:#直接在设置属性的时候,进行查看
    name=Name_Str('name')
    age=Age_Int('age')
    gender=Name_Str('gender')
    def __init__(self,name,age,gender):#name为字符串,age为数字,gender为字符串
        self.name=name
        self.age=age
        self.gender=gender
    def show(self):
        print(self.name,self.age,self.gender)
p1=Fun('100',555,'100')
# print(p1.name)#因为数据描述符的属性比实例属性的级别高,所以直接调用数据描述符get
# p1.name='500'
# print(p1.name)
# p1.gender='500'
# print(p1.gender)
p1.age=11#出发set,p1为instance,11为value
print(p1.age)

猜你喜欢

转载自www.cnblogs.com/hai125698/p/9326678.html