python使用__getitem__作为方法

5 投票
3 回答
4578 浏览
提问于 2025-04-16 01:25

在一个方法里使用 getitem 是不是可能的呢?也就是说,

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

这样我就可以做

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

3 个回答

0

如果你在修正了Class中的C之后尝试运行你的代码,你会看到一个错误提示:“TypeError: 'NoneType'对象不可下标访问”。

我觉得你可以考虑创建一个包含__getitem__方法的类,然后把function设置为这个类的一个实例。这样做有什么特别复杂的原因吗?

1

不,这样做是行不通的。想想当你访问一个被标记为@property的属性时,背后其实有一些逻辑在运行。这个get方法需要返回一个值,这个值会被用作计算属性的function。在这个情况下,function没有返回任何东西(默认为None)。所以你的下标操作会试图对None进行索引,这样就会出错。

不过,你可以让function返回一个支持__getitem__这个特殊方法的对象。这样在语法上就能“正常工作”了。

4

在Python中,所有东西都是一等公民,所以这个想法是可行的(不过语法上有点问题)。我建议把function单独做成一个类,并在里面添加一些属性,然后在MyClass中使用它,除非你有很好的理由想要隐藏数据,不然这样做会更好。

我想强调的是,我假设你想让function返回一个可以下标访问的东西,而不是一个可以下标访问的函数列表。这是两种不同的实现方式(当然也可以实现函数列表)。

举个例子,一个可以下标访问的东西(你也可以直接用list来实现):

# python

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

撰写回答