Python:如何使用某种通用setter?

时间:2016-03-21 20:44:31

标签: python

我已经制作了这段代码:

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()功能?

5 个答案:

答案 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')}