博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
描述符应用 -- 让python变成一个强类型的语言
阅读量:6280 次
发布时间:2019-06-22

本文共 2163 字,大约阅读时间需要 7 分钟。

众所周知,python是一门弱类型的语言,变量可以随意赋值成任意类型,但是通过描述符,我们可以把数据变成强类型的。

我们为数据设置数据描述符,因为数据描述的优先级大于实例属性,所以在给数据赋值的时候会优先出发数据描述符。

 

普通版

class Typed:    def __init__(self, name, expected_type):        self.name = name        self.expected_type = expected_type    def __get__(self, instance, owner):        if instance is None:            return self  # 如果实例化用People.name调用的话,就返回Typed的实例name        return instance.__dict__[self.name]    def __set__(self, instance, value):        if not isinstance(value, self.expected_type):            raise TypeError('Type error')        instance.__dict__[self.name] = value    def __delete__(self, instance):        instance.__dict__.pop(self.name)class People:    name = Typed('name', str)    age = Typed('age', int)    salary = Typed('salary', float)    def __init__(self, name, age, salary):        self.name = name        self.age = age        self.salary = salary# p1 = People(123, 18, 3333.3)  # TypeError: Type error# p1=People('egon','18',3333.3) # TypeError: Type error# p1=People('egon',18,3333)  # TypeError: Type errorp1 = People('egon', 18, 3333.33)  # 正确

 

用类的装饰器实现

先回顾一下setattr的语法

语法

setattr() 语法:

setattr(object, name, value)

参数

  • object -- 对象。
  • name -- 字符串,对象属性。
  • value -- 属性值。
class Typed:    def __init__(self, name, expected_type):        self.name = name        self.expected_type = expected_type    def __get__(self, instance, owner):        if instance is None:            return self        return instance.__dict__[self.name]    def __set__(self, instance, value):        if not isinstance(value, self.expected_type):            raise TypeError('type error')        instance.__dict__[self.name] = value    def __delete__(self, instance):        self.__dict__.pop(self.name)def typeassert(**kwargs):    def decorator(cls):        for name, expected_type in kwargs.items():            setattr(cls, name, Typed(name, expected_type))        return cls    return decorator@typeassert(name=str, age=int, salary=float)class People:    def __init__(self, name, age, salary):        self.name = name        self.age = age        self.salary = salaryp1 = People('edward', 18, 30000.00)

 

转载于:https://www.cnblogs.com/lshedward/p/10415731.html

你可能感兴趣的文章
为网页添加留言功能
查看>>
JavaScript—数组(17)
查看>>
Android 密钥保护和 C/S 网络传输安全理论指南
查看>>
以太坊ERC20代币合约优化版
查看>>
Why I Began
查看>>
同一台电脑上Windows 7和Ubuntu 14.04的CPU温度和GPU温度对比
查看>>
js数组的操作
查看>>
springmvc Could not write content: No serializer
查看>>
Python系语言发展综述
查看>>
新手 开博
查看>>
借助开源工具高效完成Java应用的运行分析
查看>>
163 yum
查看>>
第三章:Shiro的配置——深入浅出学Shiro细粒度权限开发框架
查看>>
80后创业的经验谈(转,朴实但实用!推荐)
查看>>
让Windows图片查看器和windows资源管理器显示WebP格式
查看>>
我的友情链接
查看>>
我的友情链接
查看>>
vim使用点滴
查看>>
embedded linux学习中几个需要明确的概念
查看>>
mysql常用语法
查看>>