python使用__getitem__作为方法

时间:2010-07-16 19:55:38

标签: python

是否可以在方法中使用 getitem ,即

Class MyClass:
    @property
    def function(self):
        def __getitem__():
            ...

所以我可以做到

A = MyClass()
A.function[5]
A.function[-1]

3 个答案:

答案 0 :(得分:3)

所有东西都是python中的第一类对象,所以这个想法应该有效(语法关闭),虽然我建议让function自己的类包含属性,然后在MyClass中使用它,除非你有一个非常好的数据隐藏原因不这样做......

我想指出,我假设你想让function返回一个可订阅的东西,而不是一个可订阅的函数列表。这是一个不同的实现(但也可以这样做。)

例如,可订阅的内容(您也可以只创建list):

# python

> class FooFunc(list):
>   pass
> class Foo:
>   foofunc = FooFunc()
> f = Foo()
> f.foofunc.append("bar")
> f.foofunc[0]
'bar'

答案 1 :(得分:1)

不,那不行。当您访问已装饰为@property的属性时,请考虑调用的基础描述符逻辑。 get方法需要返回一个将用作计算属性function的值。在这种情况下,函数不返回任何内容(属性的隐式None值)。然后,您的下载将尝试索引None并繁荣。

但是,您可以从支持function dunder方法的__getitem__返回一个对象。这在语法上会“起作用”。

答案 2 :(得分:0)

如果您尝试使用代码(在类中修复C之后),您将看到它产生错误:“TypeError:'NoneType'对象是不可取消的”。

我认为最好的办法是创建一个__getitem__的类,并将function设置为该类的实例。是否需要如此复杂?