Python是动态类型的,没有为方法参数提供类型提示。但是,PHP也是动态类型的, 有一个提示类型提示方法参数至少是一个类的实例(或者它是一个继承自a的类的实例定义的类)。
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;
...
}
}
是否有类似的方法来强制方法参数是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
的方式不正确/不优雅/" 不是pythonic ",我该怎么做呢?
答案 0 :(得分:4)
没有开箱即用。但是,您可以将parameter annotations与函数装饰器结合起来,几乎可以毫不费力地编写自己的函数。
但请记住,duck typing的整个想法是避免这种逻辑。
答案 1 :(得分:2)
Python中有一个强大的惯例来接受Duck Typing成语,在这种情况下,这意味着您将从baz
对象调用适当的属性而不显式检查其类型。这有很多好处,包括更好地支持多态,可以说是更易读/更简洁的代码。
如果您尝试访问该对象不支持的属性,则会引发AttributeError
异常。因此,您可以将其置于try/except
块内并在适当的时候捕获任何AttributeError
- 这是另一个称为'Easier to ask forgiveness than permission'
try:
baz.foo
except AttributeError:
# handle the exception
涵盖此主题的其他一些问题