3 回答
TA贡献1860条经验 获得超9个赞
以下代码假设您
有理由使用
self.faces
dict 而不是front
直接在实例上设置属性和/或想要为
self.faces
.
否则,这个练习是毫无意义的,因为正如 Corentin Limier 指出的那样,您可以简单地设置self.front = Face(1)
,等等。
您可以使用描述符、保存人脸名称的类变量和类装饰器。将描述符视为可重用的属性。
在以下示例代码中,我仅出于演示目的num
向Face
和 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>}
TA贡献1744条经验 获得超4个赞
如果你真的想这样做,你可以使用__getattr__和 __setattr__:
class Cube:
...
def __getattr__(self, item):
return self.faces[item]
def __setattr__(self, item, value):
self.faces[item] = value
但是当你front在方法中设置时,__init__你也可以让它成为一个普通成员......
TA贡献1943条经验 获得超7个赞
假设这就是你的班级所做的一切,你可以做类似的事情
class Cube:
...
def __getattr__(self, name):
return self.faces[name]
def __setattr__(self, name, value):
self.faces[name] = value
添加回答
举报