如何在python中有多种方法构造同一个类的对象?

时间:2014-02-06 22:10:57

标签: python

例如,

我有我的班级MyClass

我希望能够将其实例化为MyClass((1, 2)),但MyClass(1, 2)也应该导致相同。是否也可以通过某种方式编写MyClass[1, 2]来实例化它?

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])

这有一些合法的用途。但是,它们非常有限。