我正在试着如何有条件地从类中解压缩变量,这取决于你要拆包的变量数量,例如:根据我在作业左侧设置的数字,我得到一组不同的变量。
例如,让我们考虑一个同时具有x,y,z和纬度和经度位置的类:
class LatLonOrXYZ:
def __init__(self, x, y, z, lat, lon):
self.x, self.y, self.z = x, y, z
self.lat, self.lon = lat, lon
def __iter__(self):
# not sure...
return iter([self.x, self.y, self.z, self.lat, self.lon])
现在我希望实现以下内容:
pos = LatLonOrXYZ(x=0, y=1, z=2, lat=3, lon=4)
x, y, z = *pos # 0, 1, 2
lat, lon = *pos # 3, 4
是否有任何可以完成此类事情的深蟒魔法,或者我最好只写一些感觉如此不必要的方法?
与以往一样,任何帮助,见解或建议都将受到极大的欢迎:-)
这是完全可行的,但在您的示例中,可能不是可迭代的最佳应用程序。
基本上,从你的iterable中创建一个list
,就像在list([*pos])
中一样,然后像list([*pos])[0:3]
一样按需切片。
这是运行中的示例代码:
class LatLonOrXYZ:
def __init__(self, x, y, z, lat, lon):
self.x, self.y, self.z = x, y, z
self.lat, self.lon = lat, lon
def __iter__(self):
# not sure...
return iter([self.x, self.y, self.z, self.lat, self.lon])
pos = LatLonOrXYZ(x=0, y=1, z=2, lat=3, lon=4)
x, y, z = list([*pos])[0:3]
lat, lon = list([*pos])[3:5]
print(x, y, z)
print(lat, lon)
输出:
0 1 2
3 4
作为旁注,在您的示例代码中,您调用的是实际的类对象而不是pos
实例。理解差异很重要。
而不是:
pos = LatLonOrXYZ(x=0, y=1, z=2, lat=3, lon=4)
x, y, z = *LatLonOrXYZ # 0, 1, 2
lat, lon = *LatLonOrXYZ # 3, 4
你想要做的是:
pos = LatLonOrXYZ(x=0, y=1, z=2, lat=3, lon=4)
x, y, z = *pos # 0, 1, 2
lat, lon = *pos # 3, 4
第一行基于类定义创建一个对象,该类是instance
,或者是使用class
的结构和行为的对象,您将在代码中将其用作位置。
考虑以下:
pos_1 = LatLonOrXYZ(x=0, y=1, z=2, lat=3, lon=4)
pos_2 = LatLonOrXYZ(x=4, y=3, z=2, lat=1, lon=0)
这是两个具有各自特征的不同对象,两者都是LatLonOrXYZ
class
布局的结构。基于相同的蓝图分离建筑物。
这是一个非常基本的描述,只是为了指出事物的要点。你可以在这里以技术形式阅读更多关于python classes
的信息:
或者,作为一个体面的解释器的一个例子,但到目前为止,不是唯一一个关于这个东西的优秀,可访问的讨论,你应该谷歌很多:),这里: