Python是动态类型化的,没有提供方法参数的类型提示。然而,PHP也是动态类型化的,确实提供了类型提示,即方法参数至少是一个类的实例(或者它是从定义的类继承的类的实例)。
public class Foo()
{
public function __construct($qux, ...)
{
$this->qux = qux;
...
}
}
public class Bar()
{
// "Type Hinting" done here enforcing
// that $baz is an instance of Foo
public function __construct(Foo $baz, ...)
{
$this->baz = $baz;
...
}
}
有没有类似的方法可以强制方法param是Python中的特定实例?
如果不是,那么简单地断言是否是恰当的惯例?
class Foo(object):
def __init__(self, qux=None, ...):
self.qux = qux
...
class Bar(object):
def __init__(self, baz=None, ...):
# "Type Hinting" done here as `assert`, and
# requires catch of AssertionError elsewhere
assert isinstance(baz, Foo)
self.baz = baz
...
如果这是使用assert
的风格不正确/不雅/"不是蟒蛇",我该怎么办?
不开箱即用。然而,您可以将参数注释与函数装饰器结合起来,几乎可以毫不费力地编写自己的注释。
但是,请记住,鸭子类型的整个想法是为了避免这种逻辑。
Python中有一个很强的约定,即接受Duck Typing习惯用法,在这种情况下,这意味着您可以从baz
对象中调用适当的属性,而无需显式检查其类型。这有很多好处,包括更好地支持多态性,以及可以说更可读/更不冗长的代码。
如果尝试访问对象不支持的属性,则会引发AttributeError
异常。因此,您可以将其放置在try/except
块中,并在适当的时候捕获任何AttributeError
——这是另一个Python习语"请求原谅比请求许可更容易"的特点
try:
baz.foo
except AttributeError:
# handle the exception
涉及这个主题的其他一些问题
- 检查函数参数类型是Python的吗
- Python参数的类型检查
- 鸭子打字的生产力提高
- Python中的EAFP原理是什么