我在想,是否有可能在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)
我知道它基本上是一回事,因为我只能使用属性函数,所以这不是什么大问题。我只是想知道它是否可能。
答案 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