首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >@property中的python __annotations__

@property中的python __annotations__
EN

Stack Overflow用户
提问于 2021-04-01 10:20:07
回答 1查看 127关注 0票数 1

我想得到所有的注释,包括属性注释。我得到的只是为常规注释设置的注释:

代码语言:javascript
复制
from dataclasses import dataclass

@dataclass
class Test:
    first: int = 1

    @property
    def second(self) -> int:
        return 5


t = Test()
print(t.__annotations__)
# prints: {'first': <class 'int'>}

有没有办法让“第二”成为__annotations__的一部分?甚至可能强迫它进入__anotations__。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-04-02 18:15:19

使用__annotations__获取如何将数据块转换为json的信息似乎是个坏主意。它要么阻止您使用诸如InitVarClassVar之类的瞬态属性,要么导致不一致和错误的行为(如果您确实使用了它们)。您应该使用__dataclass_fields__代替。

尽管如此,有时您的用例非常简单,可以执行,或者您被一个无法轻松改进的第三方包锁定在其中,所以这里有一种方法可以将dataclass的__annotations__扩展到其属性上的那些包中:

代码语言:javascript
复制
class Test:
    var: int

    @property
    def x(self) -> int:
        return self.var + 2

    def __post_init__(self):
        cls = type(self)
        properties = [(x, getattr(cls, x)) for x in dir(cls) if type(getattr(cls, x)) == property]
        for name, property_ in properties:
            cls.__annotations__[name] = property_.fget.__annotations__["return"]

创建Test的实例现在将包含属性,就像它是一个常规类型的属性一样:

代码语言:javascript
复制
>>> Test(1).__annotations__
{'var': <class 'int'>, 'x': <class 'int'>}

顺便提一下,__post_init__代码是在每个实例的初始化过程中执行的,尽管严格地说,它只需要在类生成时运行一次,因为__annotations__是在类级别上定义的。因为它是幂等的,所以它不会破坏任何东西,但是这里是一个更令人困惑但可以说更简洁的应用程序,同样的代码也适用于普通类。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66902712

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档