加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

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

根据文件:

The Generic base class uses a metaclass that defines getitem() so
that LoggedVar[t] is valid as a type:

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

编辑

在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>酒吧

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读