解释经常在python源码中看到的@,->和:等符号。python在函数名或类名首字母用_来表示私有接口(仅供内部使用)。
标注
关联到某个变量、类属性、函数形参或返回值的标签,被约定作为类型提示来使用。
局部变量的标注在运行时不可访问,但全局变量、类属性和函数的标注会分别存放模块、类和函数的 __annotations __特殊属性中。
类型提示
标注为变量、类属性、函数的形参或返回值指定预期的类型。
类型提示属于可选项,Python 不要求提供,但其可对静态类型分析工具起作用,并可协助 IDE 实现代码补全与重构。
全局变量、类属性和函数的类型提示可以使用 typing.get_type_hints() 来访问,但局部变量则不可以。
typing.get_type_hints()
返回一个字典,字典内含有函数、方法、模块或类对象的类型提示。
一般情况下,与 obj.__annotations __相同。此外,可通过在 globals 与 locals 命名空间里进行评估,以此来处理编码为字符串字面量的前向引用。如有需要,在默认值设置为 None时,可为函数或方法注解添加 Optional[t]。对于类 C,则返回一个由所有__annotations__与 C.__mro__逆序合并而成的字典。
函数标注
即针对函数形参或返回值的标注。
函数标注通常用于类型提示:
形参标注:在形参名称后面加 : expression 即可。
函数返回标注:在形参列表后加 -> expression即可。
例如以下函数预期接受两个 int 参数并预期返回一个 int 值:
def sum_two_numbers(a: int, b: int) -> int:return a + b
变量标注
对变量或类属性的标注。
在标注变量或类属性时,还可选择为其赋值:
class C:field: 'annotation'
变量标注通常被用作类型提示:
例如以下变量预期接受 int 类型的值:
count: int = 0
装饰器
返回值为另一个函数的函数,通常使用@wrapper语法形式进行函数变换。
装饰器的常见例子包括 classmethod() 和 staticmethod()
装饰器语法只是一种语法糖,以下两个函数定义在语义上完全等价:
def f(...):...
f = staticmethod(f)@staticmethod
def f(...):...
@staticmethod
将方法转换为静态方法。
静态方法不会接收隐式的第一个参数。要声明一个静态方法,请使用此语法:
class C:@staticmethoddef f(arg1, arg2, ...): ...
静态方法的调用可以在类上进行 (例如 C.f()) 也可以在实例上进行 (例如 C().f())。
像所有装饰器一样,也可以像常规函数一样调用 staticmethod ,并对其结果执行某些操作。比如某些情况下需要从类主体引用函数并且您希望避免自动转换为实例方法。对于这些情况,请使用此语法:
class C:builtin_open = staticmethod(open)
@classmethod
把一个方法封装成类方法。
一个类方法把类自己作为第一个实参,就像一个实例方法把实例自己作为第一个实参。请用以下习惯来声明类方法:
class C:@classmethoddef f(cls, arg1, arg2, ...): ...
类方法的调用可以在类上进行 (例如 C.f()) 也可以在实例上进行 (例如 C().f())。 其所属类以外的类实例会被忽略。 如果类方法在其所属类的派生类上调用,则该派生类对象会被作为隐含的第一个参数被传入。