You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为动态实现的不对称Python类属性添加类型提示?

解决动态属性的不对称类型提示问题

当通过__getattr__/__setattr__实现动态属性时,若需声明属性读取时为ObservableList、赋值时接受任意Iterable,同时避免编写完整的@property样板代码,可采用以下方案:

仅声明@property的类型注解而不编写实际逻辑,让父类AutoFrame的动态属性处理机制接管实际操作:

from typing import Iterable

class ObservableList(list):
    """带变更事件的列表子类"""
    def custom_method(self):
        """ObservableList专属方法示例"""
        pass

class AutoFrame:
    """提供动态属性实现的父类"""
    def __getattr__(self, name):
        return self.__dict__.get(name)
    
    def __setattr__(self, name, value):
        # 模拟AutoFrame自动将Iterable转换为ObservableList的逻辑
        if hasattr(self, name) and isinstance(value, Iterable) and not isinstance(value, ObservableList):
            self.__dict__[name] = ObservableList(value)
        else:
            self.__dict__[name] = value

class MyFrame(AutoFrame):
    # 仅定义@property的类型注解,无需实现具体逻辑
    @property
    def my_list(self) -> ObservableList: ...
    @my_list.setter
    def my_list(self, val: Iterable) -> None: ...

# 类型检查验证
my_frame = MyFrame()
my_frame.my_list = [1,2,3]  # Pyright允许赋值任意Iterable对象
my_frame.my_list.custom_method()  # Pyright识别属性为ObservableList,无报错

说明

这种方式利用Pyright对@property类型注解的原生支持,仅定义属性的读写类型约束,实际的属性存取逻辑由AutoFrame的动态方法处理。既满足了类型检查的精准性,又避免了重复编写@property的样板代码,符合使用AutoFrame的初衷。

内容的提问来源于stack exchange,提问作者Torben Klein

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 20:35:54