0%

关于Python类型注解的一个问题

在 Python 中有很多特殊属性, 例如 __name__, __module__ 等有特殊的意义

__annotations__ 该函数返回对象的注解字典, 更多详情参见官方文档

https://docs.python.org/zh-cn/3/howto/annotations.html

1
2
3
4
class Human(object):

name: str
age: int

在上面的例子中, 我们创建了一个 Human 类, 同时声明了两个类属性name, age

因为我们使用了类型注解, 所以我们可以通过__annotations__方法拿到声明的这两个属性名以及类型

1
2
h = Human()
print(h.__annotations__)

输出

1
{'name': <class 'str'>, 'age': <class 'int'>}

我们得到了一个属性名:类型的键值对

此时我们继续创建一个Human的子类Man

1
2
3
class Man(Human):

name = "Naonao"

注意这里我们的类变量name没有使用类型注解, 仅仅是一个赋值的类变量

1
2
m = Man()
print(m.__annotations__)
1
{'name': <class 'str'>, 'age': <class 'int'>}

查看一下子类的__annotations__注解字典, 我们发现子类继承了父类的注解

但是如果我们这样写

1
2
3
class Man(Human):

name: str

name使用了类型注解, 我们将得到

1
{'name': <class 'str'>}

子类重写了__annotations__

https://docs.python.org/zh-cn/3/howto/annotations.html

查看官方文档发现, 这个是3.9版本之前的一个设计缺陷.

特此记录, 因为本人在此坑里陷了甚久