Python-3.5 typing.Generic subclass从不调用`__init__`

时间:2016-02-18 19:12:11

标签: python generics python-3.5

在下面的代码中,我有一个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

根据文件:

  

Generic基类使用定义 getitem ()的元类   LoggedVar [t]作为类型有效:

这是一个错误,还是我不明白?

修改

在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=' ')

1 个答案:

答案 0 :(得分:0)

在Windows上使用Python 3.5.2 64bit运行它,它运行正常! 如果它是一个错误,它现在已经修复。

输出:

  • 主要包含.foo&LT;〜T&GT; FOO
  • 主要包含.foo&LT;〜T&GT;杆