是否有可能以两种不同的方式实例化一个类的对象?

时间:2012-08-10 10:39:38

标签: python object methods instantiation

Here是一个将点创建为p=Point(x, y)的示例。假设我有一些数组ppp=(x, y),其中xy是数字,我希望将其设为类Point,但顺便说一下:p=Point(ppp)。我既可以采用其中一种方式,也可以同时进行。有两种方式可以吗?

5 个答案:

答案 0 :(得分:3)

有两种不同的方法来获取结果,第一种是分析你传递给__init__的参数,并根据它们的数量和类型 - 选择一个决定你用什么来实例化类。

class Point(object):

    x = 0
    y = 0

    def __init__(self, x, y=None):
       if y is None:
           self.x, self.y = x, x
       else:
           self.x, self.y = x, y

另一个决定是使用classmethods作为实例化器:

class Point(object):

    x = 0
    y = 0

    @classmethod
    def from_coords(cls, x, y):
       inst = cls()
       inst.x = x
       inst.y = y
       return inst

    @classmethod
    def from_string(cls, x):
       inst = cls()
       inst.x, inst.y = x, x
       return inst

p1 = Point.from_string('1.2 4.6')
p2 = Point.from_coords(1.2, 4.6)

答案 1 :(得分:2)

如果您在创建实例时知道您有元组/列表,则可以执行:p = Point(*ppp),其中ppp是元组。

答案 2 :(得分:0)

class Point:
    def __init__(self, x, y=None):
        if isinstance(x, tuple):
            self.x, self.y = x
         else:
            self.x = x
            self.y = y

答案 3 :(得分:0)

是:

class Point(object):
    def __init__(self, x, y=None):
        if y is not None:
            self.x, self.y = x, y
        else:
            self.x, self.y = x

    def __str__(self):
        return "{}, {}".format(self.x, self.y)

print Point(1,2)
# 1, 2
print Point((1,2))
# 1, 2

答案 4 :(得分:-1)

我猜你正在寻找一种重载构造函数的方法,这在静态类型语言(例如C ++和Java)中很常见。

这在Python中是不可能的。您可以做的是提供不同的关键字参数组合,例如:

class Point(object):
  def __init__(self, x=None, y=None, r=None, t=None):
    if x is not None and y is not None:
      self.x = x
      self.y = y
    elif r is not None and t is not None:
      # set cartesian coordinates from polar ones

然后您将用作:

p1 = Point(x=1, y=2)
p2 = Point(r=1, t=3.14)