例如,参加一个代表一个人的简单类。唯一的class属性是表示人名的字符串。我想确保没有人试图传递构造函数一些其他类型的对象,如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
答案 0 :(得分:6)
这就是它 - 没有使用某种形式的装饰器,但通常,类型检查不是很Pythonic,虽然在某些情况下有效,但你的代码应该是:
def __init__(self, name):
if not isinstance(name, basestring):
raise TypeError('name must be str/unicode')
# ...
请注意,basestring
是Python 2.x中str
和unicode
的父级,因此这将允许两者 - 使用str
(就像您现在所使用的那样) 2.x)不允许unicode(反之亦然 - 出于任何特殊原因)。在3.x中,basestring
不存在,您刚刚获得str
。
答案 1 :(得分:6)
您希望在__init__
方法中引发错误:
if not isinstance(name,basestring):
raise TypeError("I don't think that is a name ...")
*请注意,basestring
还包含python2.x的unicode
,但在python3.x中不可用。
但是,请注意,在person
构建完成后,此处没有任何内容可以阻止用户将人名重新设置为列表。
jack = Person("Jack")
jack.name = ["cheese","steak"] #???
如果您想要内置此安全功能,则需要开始了解property
。
答案 2 :(得分:0)
我不会在这里返回None
,而是提升和异常来表示不正确的对象类型。