使用一个函数来获取函数或常规属性的getattr

时间:2016-04-04 19:48:46

标签: python python-3.x getattr getattribute

我有以下代码:

In [38]: %paste
def set_session_attribute(obj, attribute):
    if attribute.endswith('()'):
        attribute = attribute.replace('()', '')
        return getattr(obj, attribute)()
    else:
        return getattr(obj, attribute)


class Thing(object):
    def __init__(self):
        self.legs = 4
    def length(self):
        return 6

## -- End pasted text --

In [39]: x = Thing()

In [40]: y = set_session_attribute(x, 'legs')

In [41]: y
Out[41]: 4

In [42]: z = set_session_attribute(x, 'length()')

In [43]: z
Out[43]: 6

这是因为使用"length()"致电无效(AttributeError, no attribute length()

是否有更短,更易于维护的方式来制作这样的功能?谢谢。

2 个答案:

答案 0 :(得分:5)

解决方案1 ​​

您可以.where("id IN (?)", a) property

length

如果你真的想使用你的功能:

class Thing(object):
    def __init__(self):
        self.legs = 4
    @property
    def length(self):
        return 6

>>> thing = Thing()
>>> thing.legs
4
>>> thing.length
6

如果您无法直接更改def set_session_attribute(obj, attribute): return getattr(obj, attribute) >>> set_session_attribute(thing, 'legs') 4 >>> set_session_attribute(thing, 'length') 6 的来源,则可以在导入课程后执行此操作:

thing

下面:

class Thing(object):
    def __init__(self):
        self.legs = 4
    def length(self):
        return 6

解决方案2

或者,您可以检查属性是否可调用:

Thing.length2 = property(Thing.length)

>>> thing = Thing()
>>> thing.length2
6

答案 1 :(得分:1)

使用@property装饰这些方法,您认为这些方法应该具有数据的语义而不是方法。

class Thing:
    @property
    def length(self):
        return somedata

    @property.setter
    def length(self, value):
        somename = value

t = Thing()
l0 = t.length
t.length = l1

所以这是一个吸气剂。还有一个setter @property.setter,您可以t.length = somedata代替t.set_length(somedata)