zoukankan      html  css  js  c++  java
  • 描述符应用

    一、针对name属性的类型检查

    class Type:
        def __init__(self,key):
            self.key = key
    
        def __get__(self, instance, owner):
            print("get方法")
            return instance.__dict__[self.key]
    
        def __set__(self, instance, value):
            print("set方法")
            if not isinstance(value,str):
                return "你传入的不是字符串"
            instance.__dict__[self.key] = value
    
        def __delete__(self, instance):
            print("正在执行delete")
            instance.__dict__.pop(self.key)
    
    class People:
        name = Type('name')  #这样传入参数后,就可以让描述符去代理别的属性
        def __init__(self,name,age,salary):
            self.name = name
            self.age = age
            self.salary = salary
    p1 = People('alex',13,13.3)
    print(p1.name)
    print(p1.__dict__)
    

      

    但是上述代码只能针对字符串进行判断,所以需要改进

    class Type:
        def __init__(self,key, exp_type):
            self.exp_type = exp_type
            self.key = key
    
        def __get__(self, instance, owner):
            print("get方法")
            return instance.__dict__[self.key]
    
        def __set__(self, instance, value):
            print("set方法")
            if not isinstance(value,self.exp_type):
                raise TypeError("你传入的类型不是",self.exp_type)   #高端玩法,主动引出错误
            instance.__dict__[self.key] = value
    
        def __delete__(self, instance):
            print("正在执行delete")
            instance.__dict__.pop(self.key)
    
    class People:
        name = Type('name',str)  #这样传入参数后,就可以让描述符去代理别的属性
        age = Type('age',int)
        def __init__(self,name,age,salary):
            self.name = name
            self.age = age
            self.salary = salary
    p1 = People('jinling',"18",13000)
    print(p1.name)
    print(p1.__dict__)
    

    class Type:
        def __init__(self,key, exp_type):
            self.exp_type = exp_type
            self.key = key
    
        def __get__(self, instance, owner):
            print("get方法")
            return instance.__dict__[self.key]
    
        def __set__(self, instance, value):
            print("set方法")
            if not isinstance(value,self.exp_type):
                raise TypeError("你传入的类型不是",self.exp_type)
            instance.__dict__[self.key] = value
    
        def __delete__(self, instance):
            print("正在执行delete")
            instance.__dict__.pop(self.key)
    
    class People:
        name = Type('name',str)  #这样传入参数后,就可以让描述符去代理别的属性
        age = Type('age',int)
        def __init__(self,name,age,salary):
            self.name = name
            self.age = age
            self.salary = salary
    p1 = People('jinling',18,13000)
    print(p1.name)
    print(p1.__dict__)
    

      

      

    一个奋斗中的产品小白
  • 相关阅读:
    北京联通光猫WO-36(HG220GS-U)改为桥接模式
    使用DataGrip导入数据
    Spring知识点
    mybatis-generator
    项目中mybatis连接mysql常见问题
    Spring AOP
    Volatile
    Redis知识点
    Spring IOC
    Observer模式
  • 原文地址:https://www.cnblogs.com/dabai123/p/11655803.html
Copyright © 2011-2022 走看看