В следующем коде предполагается, что у вас
есть причина иметь диктовку self.faces
вместо установки таких атрибутов, как front
, непосредственно в экземпляре
и / или хотите реализовать какую-либо значимую логику получения и установки для ключей в self.faces
.
В противном случае, это упражнение довольно бессмысленно, поскольку, как заметил вас Corentin Limierможно просто установить self.front = Face(1)
и т. д.
Вы можете использовать дескрипторы, переменную класса, содержащую имена лиц, и декоратор класса.Думайте о дескрипторах как о свойствах многократного использования.
В следующем примере кода я добавил num
переменную экземпляра к Face
и грань 'side'
только для демонстрационных целей.
class FaceDescriptor:
def __get__(self, instance, owner):
# your custom getter logic
# dummy implementation
if instance is not None:
return instance.faces[self.face]
def __set__(self, instance, value):
# your custom setter logic
# dummy implementation
instance.faces[self.face] = value
def set_faces(cls):
for face in cls._faces:
desc = FaceDescriptor()
desc.face = face
setattr(cls, face, desc)
return cls
class Face():
def __init__(self, num):
self.num = num
@set_faces
class Cube():
_faces = ['front', 'side']
def __init__(self):
self.faces = {face:Face(i) for i, face in enumerate(self._faces, 1)}
В действии:
>>> c = Cube()
>>> c.front.num
1
>>> c.side.num
2
>>> c.front = 'stuff'
>>> c.front
'stuff'
>>> c.faces
{'front': 'stuff', 'side': <__main__.Face at 0x7fd0978f37f0>}