2

是一个将点创建为 的示例p=Point(x, y)。假设我有一些数组ppp=(x, y)wherexyare numbers 并且我想使它成为类Point但方式:p=Point(ppp)。我可以用一种或另一种方式做,但不能同时做。有没有可能有两种方式?

4

5 回答 5

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

另一个决定是使用类方法作为实例化器:

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)
于 2012-08-10T10:50:32.183 回答
2

如果您在创建实例时知道p = Point(*ppp)您有一个元组/列表,您可以这样做: ,ppp元组在哪里。

于 2012-08-10T11:07:18.887 回答
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
于 2012-08-10T10:46:21.280 回答
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
于 2012-08-10T10:46:23.170 回答
-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)
于 2012-08-10T10:56:08.673 回答