在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'
答案 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
使用property
将int
的值转换为幕后的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!