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