【问题标题】:Python: how to make a method uniquely callable via getitemPython:如何通过 getitem 使方法唯一可调用
【发布时间】:2020-07-31 13:00:34
【问题描述】:

我想做这样的事情:

class Foo:
    def __init__(self):
        self.a = 0

    def __getitem__(self, item):
        return self # with some additional methods, let's say for the example
                    # one extra method 'my_method' that returns 1

f = Foo()
f.a
# 0
f.my_method()
# error: my_method not defined

f[].my_method()
# 1
f[].a
#0

我的对象有一些基本方法和其他一些方法,这些方法取决于调用__getitem__ 时传递的参数。

我试过这样的

class Foo:
    def __init__(self):
        self.a = 0

    class Handler:
        def __init__(self, item):
            self.item = item

        def my_method(self):
            return 1

    def __getitem__(self, item):
        return self.Handler(item)

f = Foo()
f[].my_method()
# 1
# but i dont have access to the outer class
f[].a
# error

【问题讨论】:

  • 您能解释一下为什么要使用 getitem 的更多动机吗?也许可以提出另一种方法来完成同样的事情。
  • 我有一个形状作为坐标列表,我需要在其他框架(不同的基础和原点)中获取该形状,以便列出我需要指定框架的形状的所有点,并通过改变基来计算它们的坐标。然后我将不得不运行这些要点中的每一个:我想这样做:for point in shape[frame] : ...。在我的示例中,Handler 应该有 __iter____next____contains__ methods

标签: python oop methods


【解决方案1】:

如果您只想访问父对象实例,请考虑简单地将访问器添加到在 _getitem_ 上创建的子类:

class Foo:
    def __init__(self):
        self.a = 0

    class Handler:
        def __init__(self, item):
            self.item = item

        def my_method(self):
            return 1

    def __getitem__(self, item):
        obj = self.Handler(item)
        obj.parent = self
        return obj

f = Foo()
f[...].my_method()
# 1
f[...].parent.a
# 0

【讨论】:

    【解决方案2】:

    按照我想要的方式完成工作

    class Foo:
        def __init__(self):
            self.a = 0
    
        @property
        def a(self):
            return self._a
    
        @a.setter
        def a(self, value):
            self._a = value
    
        class Handler:
            def __init__(self, item, a):
                self.item = item
                self.a = a
    
            def my_method(self):
                return 1
    
        def __getitem__(self, item):
            return self.Handler(item, self.a)
    

    我可以在调用 getitem 时返回一个自定义的 foo 对象。我使用属性让 Handler 中的 'a' 值被 setter 修改。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-05
      • 2011-01-11
      • 1970-01-01
      • 1970-01-01
      • 2021-10-27
      • 1970-01-01
      • 2016-06-13
      • 2023-02-25
      相关资源
      最近更新 更多