是否可以执行以下操作:
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
我希望这个例子很清楚,因为我不清楚我的想法是什么术语。我的基本目标是为没有参数的方法删除一堆括号,以使代码更清晰。
函数很慢且很少使用,因此最简单的是实时计算它而不是提前计算并存储变量。
这可能吗?这是好习惯吗?还有更好的方法吗?
答案 0 :(得分:3)
实现此目标的标准方法是使用property
,decorator:
class Foo():
@property
def bar(self):
# slow calculation
return somefloat
f = Foo()
f.bar # returns somefloat but doesn't require the empty parentheses
有几点需要注意:
您仍然需要像往常一样在方法签名中使用self
,因为有时您需要参考例如方法内部self.some_attribute
。如您所见,这根本不会影响该属性的 use 。
不需要使用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