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

Can Python 3.x enforce that a method param is a specific class instance/object? (ala PHP)

python是动态类型化的,没有对方法参数进行类型暗示的规定。但是,PHP也是动态类型的,它有一个类型的规定,暗示方法参数至少是一个类的实例(或者它是从定义的类继承的类的实例)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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中的特定实例?

如果不是,是否有适当的惯例可以简单地断言?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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,我应该怎么做?


不是开箱即用。但是,您可以将参数注释与函数修饰器结合起来,几乎可以轻松地编写自己的注释。

但是,请记住,duck类型的整个思想是为了避免这种逻辑。


在python中有一个很强的约定来接受duck类型习惯,在本例中,这意味着您可以从baz对象调用适当的属性,而不必显式地检查其类型。这有许多好处,包括更好地支持多态性和可以说更可读/更不冗长的代码。

如果试图访问对象不支持的属性,则会引发AttributeError异常。因此,您可以将它放在try/except块中,并在适当的时候捕获任何AttributeError-这是另一种称为"请求宽恕比允许更容易"的python习惯用法的特征。

1
2
3
4
try:
    baz.foo
except AttributeError:
    # handle the exception

涉及此主题的其他一些问题

  • 检查函数参数类型是pythonic吗?
  • 参数类型检查python
  • 鸭子打字的生产率提高
  • Python中的EAFP原理是什么?