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



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原理是什么

最新更新