首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python-3.5 typing.Generic子类从不调用`__init__`

Python-3.5 typing.Generic子类从不调用`__init__`
EN

Stack Overflow用户
提问于 2016-02-18 19:12:11
回答 1查看 367关注 0票数 4

在下面的代码中,我有一个Generic子类。如果我试图在直接指定类型(如Bar)之后实例化它,则似乎从未调用过__init__。有关PDB中的步骤,请参阅下面。

代码语言:javascript
复制
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

根据医生的说法:

泛型基类使用定义getitem()的元类,以便LoggedVart作为类型有效:

这是个窃听器,还是我什么都不懂?

编辑

在PDB中处理Foo('foo')案件时,注意__init__在结尾处被调用:

代码语言:javascript
复制
> /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__没有被调用,尽管所有其他相关的东西看起来都是一样的。

代码语言:javascript
复制
(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=' ')
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-12-08 02:19:58

只要在Windows上使用Python3.5.2 64位运行它,它就能正常工作了!如果是窃听器,现在就修好了。

输出:

  • main.Foo<~T> foo
  • .Foo<~T>条
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35490379

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档