Python-3.5 typing.Generic子类从不调用`__init__`
发布时间:2020-12-20 13:10:08 所属栏目:Python 来源:网络整理
导读:在下面的代码中,我有一个Generic的子类.如果我在直接指定类型后尝试实例化它(如Bar的情况),似乎永远不会调用__init__.有关PDB中的步骤,请参见下文. from typing import Generic,TypeVarT = TypeVar('T')class Foo(Generic[T]): def __init__(self,value: T):
在下面的代码中,我有一个Generic的子类.如果我在直接指定类型后尝试实例化它(如Bar的情况),似乎永远不会调用__init__.有关PDB中的步骤,请参见下文.
from typing import Generic,TypeVar T = TypeVar('T') class Foo(Generic[T]): def __init__(self,value: T): self.value = value Bar = Foo[str] foo = Foo('foo') bar = Bar('bar') print(type(foo),end=' ') print(foo.value) print(type(bar),end=' ') print(bar.value) # AttributeError 根据文件:
这是一个错误,还是我不明白的东西? 编辑 在PDB中逐步执行Foo(‘foo’)情况,注意最后调用__init__: > /home/kjw53/test.py(1)<module>() -> from typing import Generic,TypeVar (Pdb) break /usr/lib/python3.5/typing.py:1078 Breakpoint 1 at /usr/lib/python3.5/typing.py:1078 (Pdb) c > /usr/lib/python3.5/typing.py(1078)__new__() -> return next_in_mro.__new__(_gorg(cls)) (Pdb) p cls __main__.Foo[~T] (Pdb) p next_in_mro <class 'object'> (Pdb) p _gorg(cls) __main__.Foo[~T] (Pdb) s --Call-- > /usr/lib/python3.5/typing.py(858)_gorg() -> def _gorg(a): (Pdb) r --Return-- > /usr/lib/python3.5/typing.py(863)_gorg()->__main__.Foo[~T] -> return a (Pdb) n --Return-- > /usr/lib/python3.5/typing.py(1078)__new__()-><__main__.Foo...x7f57094b1a20> -> return next_in_mro.__new__(_gorg(cls)) (Pdb) s --Call-- > /home/kjw53/test.py(5)__init__() -> def __init__(self,value: T): 继续,现在击中Bar(‘bar’)案.注意__init__未被调用,尽管其他所有相关内容都相同. (Pdb) c > /usr/lib/python3.5/typing.py(1078)__new__() -> return next_in_mro.__new__(_gorg(cls)) (Pdb) p cls __main__.Foo[str] (Pdb) p next_in_mro <class 'object'> (Pdb) p _gorg(cls) __main__.Foo[~T] (Pdb) s --Call-- > /usr/lib/python3.5/typing.py(858)_gorg() -> def _gorg(a): (Pdb) r --Return-- > /usr/lib/python3.5/typing.py(863)_gorg()->__main__.Foo[~T] -> return a (Pdb) n --Return-- > /usr/lib/python3.5/typing.py(1078)__new__()-><__main__.Foo...x7f57094b1a58> -> return next_in_mro.__new__(_gorg(cls)) (Pdb) s > /home/kjw53/test.py(13)<module>() -> print(type(foo),end=' ') 解决方法
只需在Windows上使用Python 3.5.2 64bit运行它,它就可以正常工作!
如果它是一个错误,它现在已经修复. 输出: > main.Foo< ~T> FOO> main.Foo< ~T>酒吧 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |