如何在Python中使用方括号的类中实现方法(如pandas DataFrame中的loc)?

问题描述 投票:1回答:1

This answer清楚而简明地解释了如何在类中使用__getitem__方法来实现对self[key]的评估。我想知道如何在一个类中创建一个方法,该类在pandas loc类中使用像ilocDataFrame这样的括号。

Pandas中的索引器方法似乎是defined as classes themselves。然而,看看DataFrame课程,我不清楚如何调用它们。因此,如果我有自己的类,并且我想创建一个使用括号的方法,我将如何实现它?

基于user803422的建议,我已经设置了以下简单的代码,它似乎正在起作用:

class B:
    def __init__(self, a):
        self.a = a
    def __getitem__(self, value):
        return self.a[-value]

class A:
    def __init__(self, lst):
        self.lst = lst
    def __getitem__(self, value):
        return self.lst[value]
    b = B(lst)

x = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
​
a = A(x)
print(a[2])
print(a.b[2])

返回:

>>> c
>>> f

这是正确的方法吗?

python
1个回答
1
投票

那这个呢?

class A:
    def __getitem__(self, key):
        print("__getitem__: %s, value=%s" % (type(key), str(key)))

a=A()
a[2]
a[2,5]
a['a':'f']
a['a':'f', 56]

输出是:

__getitem__: <type 'int'>, value=2
__getitem__: <type 'tuple'>, value=(2, 5)
__getitem__: <type 'slice'>, value=slice('a', 'f', None)
__getitem__: <type 'tuple'>, value=(slice('a', 'f', None), 56)

编辑(澄清原始问题后):

您必须按如下方式移动b = B(lst)线:

class A:
    def __init__(self, lst):
        self.lst = lst
        self.b = B(lst)
    def __getitem__(self, value):
        return self.lst[value]
© www.soinside.com 2019 - 2024. All rights reserved.