在 Python 中有很多特殊属性, 例如 __name__
, __module__
等有特殊的意义
__annotations__
该函数返回对象的注解字典, 更多详情参见官方文档
1 | class Human(object): |
在上面的例子中, 我们创建了一个 Human
类, 同时声明了两个类属性name
, age
因为我们使用了类型注解, 所以我们可以通过__annotations__
方法拿到声明的这两个属性名以及类型
1 | h = Human() |
输出
1 | {'name': <class 'str'>, 'age': <class 'int'>} |
我们得到了一个属性名:类型
的键值对
此时我们继续创建一个Human
的子类Man
1 | class Man(Human): |
注意这里我们的类变量name
没有使用类型注解, 仅仅是一个赋值的类变量
1 | m = Man() |
1 | {'name': <class 'str'>, 'age': <class 'int'>} |
查看一下子类的__annotations__
注解字典, 我们发现子类继承了父类的注解
但是如果我们这样写
1 | class Man(Human): |
name
使用了类型注解, 我们将得到
1 | {'name': <class 'str'>} |
子类重写了__annotations__
查看官方文档发现, 这个是3.9版本之前的一个设计缺陷.
特此记录, 因为本人在此坑里陷了甚久