我想创建一个像这里这样的工厂方法。
class A:
...
class B(A):
def f(self):
...
class C:
...
def factory(cls):
return cls()
A
允许作为的参数
factory
.
什么时候?
B
通过,则正确检测到
factory(B)
是的实例
B
,即。
factory(B).f()
允许
factory(A).f()
尝试1
使用
Type
从
typing
模块。
from typing import Type
class A:
...
class B(A):
def f(self):
...
class C:
...
def factory(cls: Type[A]):
return cls()
factory(A) # Ok
factory(B) # Ok
factory(C) # Fail
factory(A).f() # Fail
factory(B).f() # Fail -- Wrong!
这个正确地检测到了
C
. 然而,
工厂(B).f()
尝试2
使用
TypeVar
.
from typing import TypeVar, Type
T = TypeVar('T')
class A:
...
class B(A):
def f(self):
...
class C:
...
def factory(cls: Type[T]) -> T:
return cls()
factory(A) # Ok
factory(B) # Ok
factory(C) # Ok -- Wrong!
factory(A).f() # Fail
factory(B).f() # Ok
很好地推断
工厂(B).f()
很好,但是
工厂(A).f()
尝试3
向添加约束
T
.
from typing import TypeVar, Type
class A:
...
class B(A):
def f(self):
...
class D(A):
...
class C:
...
T = TypeVar('T', A)
def factory(cls: Type[T]) -> T:
return cls()
factory(A) # Ok
factory(B) # Ok
factory(C) # Fail
factory(A).f() # Fail
factory(B).f() # Ok
A single constraint is not allowed
不过,出现错误的原因还不清楚。在pep484中,只有一句简短的话:“如果有,至少应该有两个约束;不允许指定一个约束。”
有什么好的解决办法吗?我只需要添加一个“虚拟”类
_A
,的空子类
A
_A = NewType('_A', A)
T = TypeVar('T', A, _A)
def factory(cls: Type[T]) -> T:
return cls()
但我并不认为这是一个好的解决办法。