例如,
我有我的班级MyClass
我希望能够将其实例化为MyClass((1, 2))
,但MyClass(1, 2)
也应该导致相同。是否也可以通过某种方式编写MyClass[1, 2]
来实例化它?
答案 0 :(得分:5)
def __init__(arg1, arg2=None):
if arg2 is None:
construct_one_way()
else:
do_something_different()
从技术上讲,您可以MyClass[1, 2]
使用自定义元类,但阅读代码的任何人都会讨厌您。括号用于元素访问。
如果你想成为那个有不可维护代码的家伙,这里是元类选项:
class DontDoThis(type):
def __getitem__(self, arg):
return self(arg)
class SeriouslyDont(object):
__metaclass__ = DontDoThis
def __init__(self, arg1, arg2=None):
if arg2 is None:
arg1, arg2 = arg1
self.arg1 = arg1
self.arg2 = arg2
演示:
>>> SeriouslyDont[1, 2]
<__main__.SeriouslyDont object at 0x000000000212D0F0>
答案 1 :(得分:2)
不,你不能以任何半懂的方式做到这一点。我能想到的语法最接近的是:
class X(object):
def __init__(self, x, y):
print x, y
X(1, 2)
X(*(1, 2))
X(*[1, 2])
这有一些合法的用途。但是,它们非常有限。