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

在python中,如何基于返回类型重载return/get?,python,overloading,constructor-overloading,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, n

在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'

那是不可能的。您可以定义一个
\uuint\uuit
方法来指定在类的实例上调用
int
时应该发生什么,这样
int(container.node)
将是3。但是不能让
container.node
实际上是3,而
container.node
container.node.hello()的一部分。对
container.node.hello()
中的属性引用的求值是从左到右进行的,因此对
container.node
求值时不会“知道”您稍后将尝试对其调用方法

正如Patrick Haugh在他的回答中所建议的,您可以将
int
子类化,以便
container.node
的行为类似于数字3,但也有一个
.hello()
方法。但您仍然没有导致
container.node
在不同的上下文中具有不同的值;您使其具有一个值,该值将两个上下文中所需的功能组合在一起。该值实际上不是
3
,而是一个节点实例,在某些情况下可能很重要。不过,这通常是一种合法的方式,可以达到与您似乎想要的效果相似的效果


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

下面,我创建了一个
node
类,它是
int
的子类,基本上只是添加了一个
hello
方法<代码>容器
使用
属性
在后台将
int
值转换为
节点
s

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!

不清楚“基于类型的退货”是什么意思。代码中没有指定任何类型;您只需通过表达式设置和访问
container.node
的值即可。您可能可以创建
node
一个
int
子类(使用
hello
方法),然后创建
container.node
一个
属性,当给定
int
时,该属性存储
节点
。这似乎是一个没有真正好处的大量工作,加上我不知道如何进行子类化
int
明智。谢谢你的反馈,我会更新itThanks!我只是想和专家确认这是不可能的。你可以这样做,但是
container.node
实际上不是3。它是一个节点实例。对于用户而言,这可能重要,也可能不重要。此外,如果您对它进行数学运算(如
x=container.node+2
),您将得到一个常规的int而不是node,这可能会让人感到困惑。@Brenbrn添加方法并不困难,允许在这些对象上使用更多类型安全的算法。我认为真正值得关注的是
Node(1)+Node(2)
不返回
Node
。我不认为
节点(3)
不是
3
是一个真正的问题。最多,这可能会让一个新手在使用
is
时绊倒,而他并不是真的这么想的。