2009-12-15 62 views

回答

6

Python没有一个内置的,但你可以定义自己:

def setdefaultattr(obj, name, value): 
    if not hasattr(obj, name): 
     setattr(obj, name, value) 
    return getattr(obj, name) 
+0

'def setdefaultattr(o,n,v):return setdefault(o .__ dict__,n,v)''?尽管如此,这不适用于带有插槽的类。 – 2009-12-15 07:02:17

1
vars(obj).setdefault(name, value) 
+0

因此vars()只返回obj .__ dict__? – 2009-12-15 01:49:44

+0

(我更喜欢var()语法obj .__ dict__) – 2009-12-15 01:50:16

+1

@Ross当然。请参阅help(vars) – 2009-12-15 01:52:17

19

需要注意的是目前公认的答案,如果属性不存在,已经调用hasattr(),setattr()和getattr()。这只有在OP做了重写setattr和/或getattr之类的操作时才有必要 - 在这种情况下,OP不是我们为他提供的无辜查询者。否则,调用所有3个函数是严重的;在SETATTR()调用应遵循return value所以它不会失败于return getattr(....)

按照docs,hasattr()被调用的getattr()和捕获异常实现。当属性已存在时,以下代码可能会更快:

def setdefaultattr(obj, name, value): 
    try: 
     return getattr(obj, name) 
    except AttributeError: 
     setattr(obj, name, value) 
    return value 
+1

EAFP +1(异常捕捉) – tzot 2010-01-06 14:42:40

+0

如果对象有重写的'setattr'和/或'getattr',为什么不能这样工作? – martineau 2012-12-23 18:25:34

+0

vars(obj)方法从我的测试中稍快(约5%) – sbaechler 2013-06-07 11:30:00

0

不要这样做。

请。使用__init__提供默认值。请。这是Pythonic的方式。

class Foo(object): 
    def __init__(self): 
     self.bar = 'bah' 

这是正常的,标准的典型方法。没有其他的理由。

+1

您是对的。对我感到羞耻:-)我应该去修复__init__函数。 – 2009-12-15 17:33:19

+0

@罗斯罗杰斯:请做。 – 2009-12-15 18:23:44

+0

可能很有理由去做要求的事情,例如,在属性被实际读取时缓存您只需要的属性的临时结果。除此之外,你在你的例子中做的应该是一个普通的类变量栏。你所做的只是无缘无故地膨胀每一个对象。 – Michael 2013-01-07 16:32:02

相关问题