将方法称为属性或函数?

时间:2017-03-20 08:57:53

标签: python properties

是否可以使用方法并将其称为函数或属性?

def Foo:
  def bar(self,x=1,y=2):
    return x+y

foo=Foo()
foo.bar #should return 3
foo.bar(4,5) #should return 9

这似乎是不可能的,因为:

  • foo.bar将致电__getattribute__;如果它是一个描述符,__get__将从__getattribute__内调用,这意味着bar()在它甚至返回给调用者之前被评估
  • 如果属性是一个函数,它只返回一个函数,然后()应用于该函数
  • 因此,如果调用者正在调用属性或函数,则无法在__getattribute__中检测到
  • 因此,双重行为是不可能的

我想要实现的是(伪代码):

def __getattribute__():
   if len(args)>1: return function
   else: return property

但是因为args没有传递给__getattribute____get__,所以我不知道在属性和函数之间切换的位置和方式。

1 个答案:

答案 0 :(得分:1)

只需使用:

foo.bar() # 3
foo.bar(4, 5) # 9

如果你坚持,这是一个非常难看,无法使用的解决方案,它实际上将返回3和9.在python 3.6上工作。不要使用它:

class CallableInt(int):
    """But, why????"""
    def __call__(self, x, y):
        return x + y


class Foo:
    @property
    def bar(self):
        return CallableInt(3)


foo = Foo()
print(foo.bar)
print(foo.bar(4, 5))