Python 3.x可以强制方法参数是特定的类实例/对象吗? (ala PHP)

时间:2014-04-14 22:00:07

标签: python python-3.x parameter-passing type-hinting

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 ",我该怎么做呢?

2 个答案:

答案 0 :(得分:4)

没有开箱即用。但是,您可以将parameter annotations与函数装饰器结合起来,几乎可以毫不费力地编写自己的函数。

但请记住,duck typing的整个想法是避免这种逻辑。

答案 1 :(得分:2)

Python中有一个强大的惯例来接受Duck Typing成语,在这种情况下,这意味着您将从baz对象调用适当的属性而不显式检查其类型。这有很多好处,包括更好地支持多态,可以说是更易读/更简洁的代码。

如果您尝试访问该对象不支持的属性,则会引发AttributeError异常。因此,您可以将其置于try/except块内并在适当的时候捕获任何AttributeError - 这是另一个称为'Easier to ask forgiveness than permission'

的Python习语的特征
try:
    baz.foo
except AttributeError:
    # handle the exception

涵盖此主题的其他一些问题