1

例如,以一个代表一个人的简单类为例。唯一的类属性是表示人员姓名的字符串。我想确保没有人试图向构造函数传递一些其他类型的对象,例如 int 或 list...等。这是我在下面的第一次尝试,我认为如果参数不是 str,这将返回 None 类型的 obj,但它似乎仍然返回 Person obj。我来自一个“更多”的强类型语言背景,我对如何在 python 中处理我自己感到有点困惑。pythonic 风格对这种情况和更一般的类型安全有什么看法?我应该提出例外吗?还是想办法返回None?或者完全是别的东西。

class Person: 

    name = None

    def __init__(self, name):
        if not isinstance(name, str):
            return None
        self.name = name
4

3 回答 3

6

就是这样 - 没有使用某种形式的装饰器,但一般来说,类型检查不是非常 Pythonic,虽然在某些情况下有效,但您的代码应该是:

def __init__(self, name):
    if not isinstance(name, basestring):
        raise TypeError('name must be str/unicode')
    # ...

请注意,它basestring是 Python 2.x 的父级strunicode在 Python 2.x 中,所以这将允许两者 - 要么使用str(就像你现在在 2.x 中一样)不允许使用 unicode(反之亦然 - 出于任何特定原因)。在 3.x 中,basestring不存在,您只有str.

于 2012-12-18T16:23:18.483 回答
6

您想在__init__方法中引发错误:

if not isinstance(name,basestring):
    raise TypeError("I don't think that is a name ...")

*请注意,这basestring也包括unicode在 python2.x 中,但在 python3.x 中不可用。

person不过要小心,这里没有什么可以阻止用户在构建后将人名重新设置为列表。

jack = Person("Jack")
jack.name = ["cheese","steak"]  #???

如果你想内置这种安全性,你需要开始学习property.

于 2012-12-18T16:23:18.637 回答
0

我不会回到None这里,而是用 raise 和 exception 来表示不正确的对象类型。

于 2012-12-18T16:23:21.807 回答