2017-02-10 69 views
0

我的目标是在python3中有一个对象与属性访问一样正常工作,除非如果通过正常查找无法使用属性它应该以其他方式获取/计算值。有没有一个很好的(r)方法在对象中具有默认值

我知道,一个可以通过定义__getattr__方法解决这个问题:

def __getattr__(self, key): 
    if key == 'foo': 
     return calculate_default_foo() 
    elif key == 'bar': 
     return getattr(dfltobj, 'bar') 
    elif key == 'frob': 
     return 42 
    raise AttributeError 

但感觉非常python2所以我不知道是否有一个更优雅的方式在python3做到这一点。只是定义property s不能很好地工作,因为它们完全覆盖了对该属性的访问,但否则如果它有效,这将是一个不错的方法。

回答

0

我不认为有办法解决它,但修改__getattr__的一个很好的(R)的方式:

def __getattr__(self, item): 
    if item == "foo" and not self.foo: 
     return calculate_default() 
    return self.__getattribute__(foo) 

希望它能帮助:)

+0

我想你是误会了一个问题位。其意图是'foo.attr2'应该产生一个默认值(可能需要在运行中计算)。 – skyking

+0

我的不好!我想我现在明白了.-。 – mikelsr

相关问题