zoukankan      html  css  js  c++  java
  • 神奇的描述符(二):使用描述符实现实例属性的类型检查

    因为描述符本身可以接管实例属性的访问,利用这个特点,可以使用描述符来实现一些实例属性的类型检查工作。

    先定义一个描述符 Point,用于管理坐标信息。

    class Point:
    
        def __init__(self, name):
            self.name = name
    
        def __get__(self, instance, owner):
            # 通常情况下,通过类属性访问描述符时,返回描述符自身
            if instance is None:
                return self
            # 通过实例属性访问描述符时,返回实例
            else:
                return instance.__dict__[self.name]
    
        def __set__(self, instance, value):
            try:
                # 检查坐标格式是否有异常
                x, y = value
                instance.__dict__[self.name] = x, y
            except TypeError:
                raise TypeError('无效的坐标信息')

    定义一个Address类,及类属性home,home接收一个坐标信息

    class Address:
    
        home = Point('myhome')

    实例化Address,并对实例属性进行赋值

    addr = Address()
    # 将坐标信息赋值给home
    addr.home = 123, 321
    print(addr.home)
    # (123, 321)
    
    # 错误的赋值
    addr.home = 123
    # TypeError: 无效的坐标信息

    第一次,赋值给home一个正确的坐标信息: 123, 321,符合point的赋值要求,并且能通过 addr.home 读取。

    第二次,赋值给home 一个 int 类型的变量 123,因为描述符会接管实例属性的读写,所以在赋值时,执行的是Point描述符的 __set__ 的方法,在对 value 进行解包时,int 类型无法解包,引发

    TypeError异常,赋值失败,达到了对实例属性进行类型检查的效果。

  • 相关阅读:
    c#隐藏和重写基类方法的区别
    c#事件(续委托之后)
    c# 中接口和抽象类的区别
    call 和apply 的一个记录
    string 和 stringbuilder 的区别
    传值和传引用
    值类型和引用类型
    标签选择器与字体连写
    input表单案例
    codeforces 676B B. Pyramid of Glasses(模拟)
  • 原文地址:https://www.cnblogs.com/blackmatrix/p/7160939.html
Copyright © 2011-2022 走看看