【问题标题】:Overriding __getitem__覆盖 __getitem__
【发布时间】:2020-12-28 05:43:34
【问题描述】:

我正在构建一个类并希望使以下“numpy like”语法工作:

#simple example
class MyClass():
    def __init__(self):
        self.arr = [1,2,3,4]

    def __getitem__(self, index):
        return self.arr[index]
    
    def print_next(self,index):
        print(self.arr(index+1))

    def print_previous(self,index):
        print(self.arr(index-1))

a = MyClass()
a.arr[2].print_next() #4
a.arr[2].print_previous() #2

__getitem__ 只允许我访问索引而不是之后的方法调用。我正在研究元类以更改 __getitem__,但我不知道如何继续。

【问题讨论】:

  • 你能举一个例子来说明你在 numpy 中的尝试吗?
  • 接下来的方法调用是类MyClass的方法。如果您的目标是然后调用一个方法liket hat,__getitem__ 将需要返回self
  • 嗨!欢迎来到 SO!请记住在您的问题中添加尽可能多的信息,由于类型错误,您提供的代码将无法运行,这些错误未作为您问题的一部分进行描述。此外,最好解释一下您要实现的目标,并在可能的情况下展示一个示例(也许使用 NumPy 作为参考?)。提前致谢!

标签: python-3.x metaclass


【解决方案1】:

你可以这样做:

In [86]: class MyClass():
    ...:     def __init__(self):
    ...:         self.arr = [1,2,3,4]
    ...:         self.index = None
    ...:
    ...:     def __getitem__(self, index):
    ...:         self.index = index
    ...:         return self
    ...:
    ...:     def print_next(self):
    ...:         print(self.arr[self.index+1])
    ...:
    ...:     def print_previous(self):
    ...:         print(self.arr[self.index-1])
    ...:

您实际上不需要为 print_nextprint_previous 提供另一个参数,因为您希望再次调用一个方法。

虽然不建议这样做,因为您将覆盖 __getitem__ 以仅返回 self 并设置一个变量。

但现在你可以这样做了:

In [90]: a[2].print_next()
4
In [91]: a[2].print_previous()
2

【讨论】:

  • 谢谢,比我想象的要简单,但我想不出来。你完美地回答了我的问题!
  • 没问题。您可能还想在其中进行一些健全性检查。就像初始化 self.index = 0 并确保下一个和上一个项目在有效索引范围内。
猜你喜欢
  • 2020-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-17
  • 2019-12-16
  • 2016-01-10
  • 2011-06-11
  • 2012-01-28
相关资源
最近更新 更多