首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Python3.x可以强制一个方法param是一个特定的类实例/对象吗?(ala PHP)

Python3.x可以强制一个方法param是一个特定的类实例/对象吗?(ala PHP)
EN

Stack Overflow用户
提问于 2014-04-14 22:00:06
回答 2查看 135关注 0票数 1

Python是动态类型的,它没有提供方法参数的类型提示。但是,PHP也是动态类型的,它确实提供了一个类型提示--暗示一个方法参数至少是一个类的实例(或者是一个从定义的类继承的类的实例)。

代码语言:javascript
代码运行次数:0
运行
复制
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中的一个特定实例?

如果不是,那么是否应该简单地声明一下呢?

代码语言:javascript
代码运行次数:0
运行
复制
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的方式是不正确的/不雅/“不是琵琶”,我应该做什么呢?

EN

回答 2

Stack Overflow用户

发布于 2014-04-14 22:09:07

不是从盒子里出来的。但是,您可以将参数注解与函数装饰器结合起来,几乎不费吹灰之力地编写您自己的。

但是,请记住,鸭型的全部思想是避免这种逻辑。

票数 4
EN

Stack Overflow用户

发布于 2014-04-14 22:39:51

Python中有一个很强的习惯,可以接受鸭型成语,在本例中,这意味着您将调用来自baz对象的适当属性,而不显式地检查其类型。这有许多好处,包括对多态性的更好支持,以及可读性更强/更少冗长的代码。

如果试图访问对象不支持的属性,则会引发AttributeError异常。因此,您可以将其放置在try/except块中,并在适当时捕获任何AttributeError --这是另一个称为“请求宽恕比许可更容易”的Python成语的特征。

代码语言:javascript
代码运行次数:0
运行
复制
try:
    baz.foo
except AttributeError:
    # handle the exception

其他一些涉及这个主题的问题

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23071213

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档