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'
それは可能ではありません。クラスのインスタンスでが呼び出された__int__
ときに何が起こるかを指定するメソッドを定義できるため、3になります。ただし、の一部が別のものである場合、実際に3にすることはできません。の属性参照の評価は左から右に行われるため、後でメソッドを呼び出そうとすることを「知らずに」評価されます。int
int(container.node)
container.node
container.node
container.node.hello()
container.node.hello()
container.node
Patrick Haughが彼の答えで示唆しているように、サブクラス化int
することcontainer.node
ができます。これは、3番のように動作するだけでなく、.hello()
メソッドもあります。しかし、それでもcontainer.node
、異なるコンテキストで異なる値を持たせることはありません。2つのコンテキストで必要な機能を組み合わせた1つの値を持つようにします。値は実際に3
はノードインスタンスではなく、状況によっては問題になる可能性があります。それでも、これは多くの場合、あなたが望んでいるように見えるものと同様の効果を達成するための正当な方法である可能性があります。
値を3以外の値(たとえば、ラッパーオブジェクト)に設定する__setattr__
ように使用することもできcontainer.node = 3
ますが、上記は変更されません。評価する場合container.node
、すべてのコンテキストで1つの値しか持つことができません。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加