在python中,如何根据return类型重载return/get?

In python, how to overload return/get based on return type?

在python中,是否可以重载return类型?基本上,我想看看我是否可以做这样的事情:

class Node(object):
   def __init__(self):
       self.value = 5

   def hello(self):
       print('hello')

class Container(object):
   def __init__(self):
       self.node = Node()

   def __setattr__(self, name, value):
       if self.__dict__.get(name, False) and name == 'node':
          obj = getattr(self, name)
          obj.value = value
       else:
          self.__dict__[name] = value

       # some method overloading... to return base on type

container = Container()
container.node = 3
print (container.node.value) # outputs 3
int_val = 0
int_val = container.node  # assign int_val to 3
container.node.hello() # prints out 'hello'

这不可能。您可以定义一个 __int__ 方法来指定在 class 的实例上调用 int 时应该发生什么,这样 int(container.node) 就是 3。但是您不能container.node 实际上 3,而 container.node.hello()container.node 部分是另一回事。 container.node.hello() 中的属性引用的求值从左到右发生,因此 container.node 的求值没有 "knowing",稍后您将尝试在其上调用方法。

正如 Patrick Haugh 在他的回答中所建议的那样,您可以子class int 这样 container.node 就是 表现 的东西3 但也有一个 .hello() 方法。但是您仍然没有导致 container.node 在不同的上下文中具有不同的值;您正在使它具有一个值,该值结合了您在两种情况下所需的功能。该值实际上不是 3 而是一个 Node 实例,这在某些情况下可能很重要。不过,这通常是实现您似乎想要的类似效果的合法方式。

也可以使用 __setattr__ 以便 container.node = 3 将值设置为 3 以外的值(例如,某些包装对象),但这不会改变上面的内容.当您计算 container.node 时,它在所有上下文中只能有一个值。

下面,我做了一个 Node class,它是 int 的子 class,基本上只是添加了一个 hello 方法。 Container 在幕后使用 propertyint 值转换为 Node

class Node(int):
    def __new__(cls, value, *args, **kwargs):
        return super(Node, cls).__new__(cls, value, *args, **kwargs)
    def hello(self):
        print("Hello!")

class Container(object):
    def __init__(self):
        self.node = 5
    @property
    def node(self):
        return self._node
    @node.setter
    def node(self, value):
        self._node = Node(value)

container = Container()
container.node = 3
print(container.node)  # 3
container.node.hello()  # Hello!