我已经制作了这段代码:
if fc.get('field_photo_1'):
pt.photo1 = fc.get('field_photo_1')
if fc.get('field_photo_2'):
pt.photo2 = fc.get('field_photo_2')
if fc.get('field_photo_3'):
pt.photo3 = fc.get('field_photo_3')
我想将它优化为某种类似的代码:
update_field(photo1, 'field_photo_1'):
update_field(photo2, 'field_photo_2'):
update_field(photo3, 'field_photo_3'):
我只是不知道如何在python中使用索引编写setter
。您将如何实现update_field()
功能?
答案 0 :(得分:1)
您可以查看setattr()功能。
答案 1 :(得分:0)
我建议制作一组照片,然后使用for循环迭代字符串,而不是尝试创建这样的setter。它更容易理解,并且不会对您的课程执行其他程序员可能不会期望的不常见的事情。
class Pt:
def __init__(self):
self.photos = [None for i in range(3)]
pt = Pt()
for i in range(1,4)
fieldString = 'field_photo_{0}'.format(i)
if fc.get(fieldString):
pt.photos[i] = fc.get(fieldString)
答案 2 :(得分:0)
您正在寻找setattr
,它接受字符串属性名称。
试试这个:
for x in range(1, 4):
attrname = "photo_".format(x)
setattr(pt, attrname, fc["field_".format(attrname)])
您应该重构代码,但要使用列表。
答案 3 :(得分:0)
如果您想根据传递的参数设置pt属性,可以采用setattr。
def update_field(attribute, value):
setattr(pt, attribute, value)
此处的其他答案假设您正在迭代预设数量的照片属性。如果你想要一套,那么上面应该有效。如果想要全部设置,Ben或Ritave的答案可能更合适。
取决于“pt”变量的范围。您可能需要执行setattr(self.pt, attribute, value)
之类的操作。
答案 4 :(得分:0)
您可以使用dict
:
photos = dict()
photos['photo1'] = fc.get('field_photo_1')
# etc...
或者更简洁:
photos = {photo: fc.get(photo) for photo in ('field_photo_1', 'field_photo_2', 'field_photo_3')}