【问题标题】:Redirect method calls like __getattribute__()?重定向方法调用,如 __getattribute__()?
【发布时间】:2020-06-07 20:46:37
【问题描述】:

我正在尝试继承numpy.ndarray,但需要在方法中调整数组的大小,但目前没有答案:

Resize inherited ndarray, inside a method?

所以我的问题是如何将方法重定向到本地对象。 对于属性,您可以使用 __getattribute____getattr__ 是否有类似的方法选项?

类似这样的:

class Blah():

   def __init__(...):
       ......
       self.obj = np.zeros(...)

  def __get_method__(self, method):
      return self.obj.method() ????

【问题讨论】:

  • 方法(或者更确切地说,产生它们的函数)是属性。 __getattr__ 仅用于通过正常查找过程找不到的属性,而不是用于拦截现有属性。

标签: python redirect methods subclass


【解决方案1】:

你不能只继承numpy.array吗?

class Blah(numpy.array):
    def __init__(self, *args, **kwargs):
        numpy.array.__init__(self, *args, **kwargs)
        ....

    def resize(self, ...):
        ....

作为一种有时可能更方便的技巧,您可以选择这样做

class Blah:
    ...
    def __getattr__(self, name):
        return getattr(self.obj, name)

但这通常是你以后会后悔的事情:-}。

编辑:回到第一种(更好的)方式:您可以就地调整大小。见这里:https://numpy.org/doc/stable/reference/generated/numpy.ndarray.resize.html#numpy.ndarray.resize

【讨论】:

  • numpy 由 _new_ 继承,还有一些额外的逻辑......在继承的类中调整大小不起作用......至少我还没有找到方法..:ValueError:无法将输入数组从形状(40)广播到形状(20)
  • 哦,是的,你是对的。我现在在这里看到它:docs.scipy.org/doc/numpy-1.13.0/user/basics.subclassing.html。那我希望你可以通过第二种方式(__getattr__)。
  • 所以这将调用方法“名称”?论据呢?
  • 是的,当请求一个不在Blah 中的属性时,它会调用这个函数并从obj 返回那个属性,例如你的numpy.array。这可以只是一个整数,也可以是一个方法。如果它是一个方法,则调用与原生对象完全一样,包括参数和返回值。
猜你喜欢
  • 2012-06-07
  • 1970-01-01
  • 2019-04-13
  • 1970-01-01
  • 2014-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多