Я хочу группировать атрибуты экземпляров класса, так что было бы легко выполнить итерацию по всем атрибутам, принадлежащим группе. Очевидным ответом было бы включить все это в список или dict, но тогда я не смог бы получить к ним доступ как атрибуты своего объекта, и я бы предпочел это.Элегантный способ группировки атрибутов
В некотором коде должно быть ясно, что я хочу. Здесь у меня есть список и реальные атрибуты.
class Vectors(object):
def __init__(self, v1, v2, v3):
self.v1 = v1
self.v2 = v2
self.v3 = v3
self.rotatable = ['v2', 'v3']
def rotate(self, angle):
for v in self.rotable:
new_vector = do_rotate(getattr(self, v), angle)
setattr(self, v, new_vector)
class MoreVectors(Vectors):
def __init__(self, v4, *args, **kwargs):
super(MoreVectors, self).__init__(*args, **kwargs)
self.v4 = v4
self.rotable.append('v4')
Теперь при вызове rotate()
он знает, что векторы вращать и я могу добавить больше векторов в этот список динамически. Однако, хотя это и делает свою работу, для меня это выглядит не так элегантно, как я должен сам управлять списком.
Есть ли более простой способ написать это? Я думал о сохранении всех атрибутов в словаре, где каждая группа является ключом, а затем используйте properties()
, чтобы я мог получить доступ ко всем элементам словаря в качестве атрибутов. Это было бы достаточно чисто для меня, но я не знаю, как динамически устанавливать свойства внутри метода.
В общем, если у вас есть атрибуты с именем 'v1', 'v2', ...,' vn', возможно, что-то не так с вашим дизайном. Что происходит с доступом к объектам «obj.vectors [0]» и т. Д.? – geoffspear
В этом примере решением является 'def rotate_vectors (angle, * vectors): return [do_rotate (вектор, угол) для вектора в векторах]'. Использование класса глупо. –
Хорошо. Этот класс является просто упрощением моего реального кода. В моем реальном коде у меня есть описательные имена всех моих векторов, и класс более сложный, чем этот. Я просто извлек часть, которая была актуальна. –