【问题标题】:Generic class method on non-generic class非泛型类的泛型类方法
【发布时间】:2021-02-16 16:56:16
【问题描述】:

我正在尝试在非泛型类上创建一个方法,该方法会创建另一个泛型类并返回它。

from dataclasses import dataclass
from typing import TypeVar, Generic

T = TypeVar('T')

@dataclass
class Item(Generic[T]):
    name: str
    value: T = None

class OtherClass:
    def CreateItem(self, type: T, name: str, value=None):
        return Item[T](name=name, value=value)

other = OtherClass()
item = other.CreateItem[int]("some_field", 45)

item 到底应该是Item[int]。这样的事情可能吗?

【问题讨论】:

    标签: python python-3.x templates generics type-hinting


    【解决方案1】:

    您的代码几乎可以正常工作。您可以通过将类型 int 作为参数传递给 CreateItem 函数来修复它:

    from dataclasses import dataclass
    from typing import TypeVar, Generic
    
    T = TypeVar('T')
    
    @dataclass
    class Item(Generic[T]):
        name: str
        value: T = None
    
    class OtherClass:
        def CreateItem(self, tp, name: str, value=None):
            return Item[tp](name=name, value=value)
    
    other = OtherClass()
    item = other.CreateItem(int, "some_field", 45)
    

    但是,请注意 Python 中的类型提示主要用于 mypy 和 IDE 等类型检查器中的静态分析。它们通常不在运行时使用。

    你也可以用这个替换OtherClass,而不使用Item的具体类型提示:

    class OtherClass2:
        def CreateItem(self, name: str, value=None):
            return Item(name=name, value=value)
    
    other2 = OtherClass2()
    item2 = other2.CreateItem("some_field", 45)
    

    itemitem2不会有区别:

    assert item == item2  # this assertion will pass
    

    【讨论】:

    • 这与Item[Any] 有何不同?据我了解,必须推断 item 或 item2 的类型,并且类型检查器无法强制执行。
    猜你喜欢
    • 1970-01-01
    • 2015-07-30
    • 1970-01-01
    • 1970-01-01
    • 2017-07-14
    • 2012-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多