簡體   English   中英

為什么 Python 子類不繼承其父類的注解?

[英]Why a Python subclass does not inherit its parent class's annotations?

Python 子類顯然不繼承其父類的注釋:

#!/usr/bin/env python3

class A:
    valA: int
    
class B(A):
    valB: str

print(B.__annotations__)

Output:

{'valB': <class 'str'>}

這是為什么? 我怎樣才能做到這一點?

主意:

#!/usr/bin/env python3

def updateAnnotations(annotations, bases):
    for base in bases:
        annotations.update(getattr(base, '__annotations__', dict()))

class A:
    valA: int
    
class B:
    valB: int
    
class C(A, B):
    valC: int
    
    updateAnnotations(__annotations__, [A, B])

print(sorted(C.__annotations__.items()))

Output:

[('valA', <class 'int'>), ('valB', <class 'int'>), ('valC', <class 'int'>)]

使用裝飾器:

def update_annotations(cls: typing.Type) -> typing.Type:
    annotations = getattr(cls, '__annotations__', None)
    if annotations == None:
        cls.__annotations__ = dict()
        annotations = cls.__annotations__

    for clsType in [cls] + list(cls.__bases__):
        annotations.update(getattr(clsType, '__annotations__', dict()))

    return cls

class A:
    valA: int

class B:
    valA: str
    valB: int

@update_annotations    
class C(A, B):
    valC: int
    
    def __init__(self):
        self.valA = 'asd'
        self.valB = 30
        self.valC = 40

print(C.__annotations__)

Output:

{'valC': <class 'int'>, 'valA': <class 'str'>, 'valB': <class 'int'>}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM