我想使用classmethod来返回当前类的新实例,我尝试了一些类似下面的代码,但它引发了一个NameError('name'T'未定义')
将代码T = TypeVar('T', bound=A)
放在上面的class A
上也不起作用。
处理它有什么好主意吗?
import json
from typing import TypeVar
class A(dict):
def __init__(self, name):
super(dict, self).__init__()
self["name"] = name
@classmethod
def foo(cls: T, args: str)->T:
return json.loads(args)
T = TypeVar('T', bound=A)
class B(A):
pass
b = B(name='B')
# True
print(isinstance(b.foo(json.dumps(b)),B))
答案 0 :(得分:2)
使用字符串对A
进行前瞻性引用,并为cls
提供Type[T]
的正确类型:
import json
from typing import Type, TypeVar
T = TypeVar('T', bound='A')
class A(dict):
def __init__(self, name: str) -> None:
super().__init__(name=name)
@classmethod
def foo(cls: Type[T], args: str) -> T:
return cls(**json.loads(args))
class B(A):
def is_b(self) -> bool:
return True
b = B.foo('{"name": "foo"}')
print(b.is_b())