【问题标题】:is there a way to redefine the behavior for the . operator for a python class?有没有办法重新定义 . python类的运算符?
【发布时间】:2014-10-30 20:43:57
【问题描述】:

问题是,我有一个类,我想在 python 中定义一个类,以便能够在调用主类的函数时将责任转嫁给另一个类。 例如:

class Multi_Interface:
    def __init__(self):
        interfaces = [Interface("message A"), Interface("Message B")]
        self.set_interface(0)

    def set_interface(self, interface_index = 0):
        current_interface = self.interfaces[interface_index]
    # @todo: override the .operator to call the member of the current interface.

class Interface:
    def __init__(self, message):
        self.msg = message

    def do_stuff(self, message="I am a parameter"):
        print message + self.msg

mi = Multi_Interface()
mi.do_stuff(message="the internal message is: ")
mi.set_interface(1)
mi.do_stuff(message="the internal message is: ")
mi.do_stuff()

>>> the internal message is: mesage A
>>> the internal message is: mesage B
>>> I am a parameter: mesage B

有没有办法为一个类重载这个运算符? 如何重载这个运算符? 我对如何从子对象获取方法有一个想法,前提是我可以在方法中获取字符串。

【问题讨论】:

  • 我认为你想继承。尝试像这样开始您的 Multi_Interface 类:class Multi_Interface(Interface) 这样 Multi_Interface 将继承接口中定义的所有方法,只要您以与接口相同的方式构造它...您的代码中还有其他错误,比如self.interfaces 不存在。
  • 该解决方案的问题在于,我正在处理的接口并不总是从接口类派生的具体类,并且会有很多方法。因此,我希望接听调用并尝试将其传递给接口,而不必显式覆盖具体接口类中的每个方法。
  • 我个人看不到没有子类化的方法(也许让Interface 成为一个超级最低限度的类)......如果你仍然坚持重载. 然后根据stackoverflow.com/questions/1936135/… 它有可能……
  • 大多数时候,对于此类问题,有更好的、不那么神奇的解决方案。你能问得更具体点吗?
  • 我正在寻找在使用“。”之后在类中查找成员时调用的特殊方法。如“instance.method_name(parameters)”;我正在寻找这种方法,以便我当然可以覆盖它。我怀疑它可能是下一页上的 attrgetter 方法,但我不确定这是否是我需要覆盖的方法。 docs.python.org/2/library/operator.html

标签: python operator-overloading overriding overloading


【解决方案1】:

最终解决方案如下

class Multi_Interface:
    def __init__(self):
        self.interfaces = [Interface("message A"), Interface("Message B")]
        self.current_interface = None
        self.set_interface(0)

    def set_interface(self, interface_index = 0):
        self.current_interface = self.interfaces[interface_index]

    def __getattr__(self, name):
        return getattr(self.current_interface, name)

class Interface:
    def __init__(self, message):
        self.msg = message

    def do_stuff(self, message="I am a parameter "):
        print message + self.msg

mi = Multi_Interface()
mi.do_stuff(message="the internal message is: ")
mi.set_interface(1)
mi.do_stuff(message="the internal message is: ")
mi.do_stuff()

【讨论】:

  • 特别感谢 TehTris 为我指明了正确的方向。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多