在python中,如何基于返回类型重载return/get?
在python中,是否可以重载返回类型?基本上,我想看看我是否能做这样的事情:在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
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
时绊倒,而他并不是真的这么想的。