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

时间:2018-09-06 18:12:57

标签: python overloading constructor-overloading

在python中,是否可以重载返回类型?基本上,我正在尝试查看是否可以执行以下操作:

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'

2 个答案:

答案 0 :(得分:0)

那是不可能的。您可以定义一个__int__方法来指定在类的实例上调用int时应该发生的情况,这样int(container.node)将为3。但是您不能拥有{{1 }}实际上是 be 3,而container.node的{​​{1}}部分是另外一回事。对container.node中的属性引用的评估是从左到右进行的,因此对container.node.hello()的评估没有“知道”您稍后将尝试在其上调用方法。

正如Patrick Haugh在回答中所建议的,您可以将container.node.hello()子类化,以使container.node像数字3一样表现,但也有一个int方法。但是,仍然不会使container.node在不同的上下文中具有不同的值;您将导致它具有一个值,该值结合了两种情况下所需的功能。该值实际上不是.hello(),而是Node实例,这在某些情况下可能很重要。尽管如此,这通常仍然是达到与您想要的效果相似的合法方法。

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

答案 1 :(得分:0)

下面,我制作一个Node类,它是int的子类,基本上只是添加了一个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!