python中同一个类下的常规和属性函数相同

时间:2016-02-24 15:59:15

标签: python-2.7

我在想,是否有可能在python中的同一个类下有一个属性函数和一个具有相同名称的常规函数​​?我想做这样的事情:

class foo(object):
  def __init__(self):
    self.x = []

  @property
  def get_x(self):
    return self.x

  def get_x(self, n):
    return self.x[n]

所以我可以用下面不同的方式来调用它:

f = foo()

# get the whole list
x = f.get_x

# One way to get the n-th element
x = f.get_x[n]

# Another way to get the n-th element
x = f.get_x(n)

我知道它基本上是一回事,因为我只能使用属性函数,所以这不是什么大问题。我只是想知道它是否可能。

1 个答案:

答案 0 :(得分:1)

好吧,根据this question,您无法在功能上添加__getitem__

此外,您无法向常规__call__添加方法list

a = [1,2,3]
a.__call__ = lambda n: a(n)
a(1) # AttributeError: 'list' object has no attribute '__call__'

考虑到这一点,您可能必须制作自己的list数据结构,并在其被调用时添加自定义行为。

class callableList(list):
    def __call__(self, index):
        return self[index]

class foo(object):
    def __init__(self):
        self.x = callableList()

    @property
    def get_x(self):
        return self.x

结果属性x既可以下标也可以调用。

f = foo()
f.x.extend([1,2,3])

print f.get_x[0] # 1
print f.get_x(1) # 2
print f.x(2)     # 3