将类属性别名化为函数

时间:2015-01-28 05:32:45

标签: python attributes

是否可以执行以下操作:

class foo():
    def bar():  # a method that doesn't take any args
        # slow calculation
        return somefloat

    b = bar  # bar is a function but b just gives you the float attribute

f = foo()
f.b  # returns somefloat but doesn't require the empty parentheses

我希望这个例子很清楚,因为我不清楚我的想法是什么术语。我的基本目标是为没有参数的方法删除一堆括号,以使代码更清晰。

函数很慢且很少使用,因此最简单的是实时计算它而不是提前计算并存储变量。

这可能吗?这是好习惯吗?还有更好的方法吗?

3 个答案:

答案 0 :(得分:3)

实现此目标的标准方法是使用propertydecorator

class Foo():

    @property
    def bar(self):
        # slow calculation
        return somefloat


f = Foo()

f.bar  # returns somefloat but doesn't require the empty parentheses

有几点需要注意:

  1. 您仍然需要像往常一样在方法签名中使用self,因为有时您需要参考例如方法内部self.some_attribute。如您所见,这根本不会影响该属性的 use

  2. 不需要使用f.bar()方法和f.b属性来混淆您的API - 最好决定什么对您的类最有意义而不是提供一堆不同的方法做同样的事情。

答案 1 :(得分:2)

b = bar显然不起作用。但是,对于最简单的“不需要空括号”的属性会问你的:

b = property(bar)

现在每次访问f.b都会在窗帘后面调用f.bar()“。

但是,这意味着如果您访问f.b两次,f.bar()会被调用两次,重复计算。如果重复是无关紧要的(即如果结果对于同一对象的重复计算没有改变),你可以做得更好(在f.b一旦首次计算后永远“缓存”结果) - 类似于:

class foo(object):
    def bar(self):  # a method that doesn't take any args
        # slow calculation
        return somefloat

    def _cache_bar(self):
        result = self.bar()
        setattr(self, 'b', result)
        return result

    b = property(_cache_bar)

答案 2 :(得分:0)

通过静态方法,但需要通过括号调用。

class foo(object):
    @staticmethod
    def bar():  # a method that doesn't take any args
        # slow calculation
        return "abc"

    b = bar  # bar is a function but b just gives you the float attribute

f = foo()
print f.b()

输出:

$ python test.py 
abc