在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
在幕后使用 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!
在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
在幕后使用 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!