オーバーライドできます__new__()
:
class test(object):
def __new__(cls, x, y):
return x+y
z = test(1, 2)
print z # => 3
そうは言っても、多かれ少なかれ常にそうすることがどれほど信じられないほど無意味であるかを十分に強調することはできません.
sum()
無意味ですが、メソッドにすることもできます。
class test(object):
def __new__(cls, *args, **kwargs):
test_obj = super(test, cls).__new__(cls)
test_obj.__init__(*args, **kwargs)
return test_obj.sum()
def __init__(self, x, y):
test.x = x
test.y = y
def sum(self):
return self.x + self.y
z = test(1, 2)
print z
ただし、__new__
実装の外部からアクセスする方法はありません。または、手動でandtest
を呼び出して「難しい方法」でインスタンスを作成せずに、その時点でスーパーバイザーの手による暴力が正当化されます。object.__new__()
__init__
倒錯を最大限にするために、ここに@kindallの提案されたバリアントがあります – もちろん、不必要にオーバーエンジニアリングされています:
メタクラスで
class meta_delegate(type):
def __call__(cls, *args, **kwargs):
obj = cls.__new__(cls)
obj.__init__(*args, **kwargs)
delegate = cls.__delegate
if (isinstance(delegate, basestring)):
delegate = getattr(obj, delegate)
return delegate()
else:
return delegate(obj)
@staticmethod
def to(delegate):
def __new__(*args, **kwargs):
cls = meta_delegate(*args, **kwargs)
cls.__delegate = delegate
return cls
return __new__
class test(object):
def __init__(self, x, y):
test.x = x
test.y = y
def sum(self):
return self.x + self.y
__metaclass__ = meta_delegate.to(sum)
私は実際にそれが機能することに正直に驚いています。メタクラスを呼び出すと、その__call__
.
そして最後に、すべてがまったく無意味であることを説明するためだけに:
無意味すぎて円形
class meta_delegate(type):
def __call__(cls, *args, **kwargs):
return cls.__delegate(*args, **kwargs)
@staticmethod
def to(delegate):
def __new__(*args, **kwargs):
cls = meta_delegate(*args, **kwargs)
cls.__delegate = staticmethod(delegate)
return cls
return __new__
class test(object):
__metaclass__ = meta_delegate.to(lambda x, y: x+y)
ここでのデリゲートは任意の呼び出し可能にすることができ、API ははるかに単純です! 失礼しますが、飲みに行きます。