Это вполне выполнимо, но, возможно, в вашем примере это не лучшее приложение итерируемого.
По сути, создайте 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
, здесь в технической форме:
Python.org Учебное пособие по классам
Или, как пример достойных объяснений, нодалеко не единственное отличное, доступное обсуждение, касающееся этого материала, для которого вы должны гуглить лоты :), здесь:
ООП в Python - в Real Python