python相对较新。我最近发布了一个关于验证数据类型是布尔值的问题。 [Use a Descriptor (EDIT: Not a single decorator) for multiple attributes?鸭子打字:你会如何对待这种情况
给出的答案引用了鸭子打字。我有一个简单的例子,并且要确保我明白。如果我的代码是:
class Foo4(object):
def __init__(self):
self.bool1=True
def send_rocket(self, bool_value):
if not bool_value:
print "Send rocket ship to sun first... bad move."
print "Send rocket ship to Mars... good move."
f=Foo4()
f.send_rocket(f.bool1)
#Send rocket ship to Mars... good move.
f.bool1=None
f.send_rocket(f.bool1)
#Send rocket ship to sun first... bad move.
#Send rocket ship to Mars... good move.
如果我没有理解鸭打字有点正确,在上面的I类信任是BOOL1将永远是一个布尔值:我不应该检查是否BOOL1 ==虚假或BOOL1 = =真。当某人错误地使用我的模块,即bool1 = None时,该方法执行一些我不想执行的操作,但没有指出存在问题 ......并且飞船上的人员死亡。
我可以编写代码,以确保BOOL1另一种方式始终是一个真正的布尔将是(对BooleanDescriptor学分在上面的链接!):
class BooleanDescriptor(object):
def __init__(self, attr):
self.attr = attr
def __get__(self, instance, owner):
return getattr(instance, self.attr)
def __set__(self, instance, value):
if value in (True, False):
return setattr(instance, self.attr, value)
else:
raise TypeError
class Foo4(object):
def __init__(self):
self._bool1=True
bool1 = BooleanDescriptor('_bool1')
def send_rocket(self, bool_value):
if not bool_value:
print "Send rocket ship to sun... bad move."
print "Send rocket ship to Mars... good move."
f=Foo4()
f.send_rocket(f.bool1)
#Send rocket ship to Mars... good move.
f.bool1=None
#TypeError.
#Never gets here: f.send_rocket(f.bool1)
难道我明白第一的路要走(不检查)是正确的路要走吗?我的意思是,我总是可以在第一个例子中明确写入代码:
if bool_value ==True:
print "do something"
elif bool_value == False:
print "do something else"
else:
print "invalid boolean value"
但如果我这样做,在每一个方法等等,我用BOOL1,为什么在赫克将我只是没有验证那个bool1是第一个真正的布尔值(DRY!)!?!? :-)
谢谢!
保罗