How to dynamically assign values to class properties in Python?

匿名 (未验证) 提交于 2019-12-03 00:54:02

问题:

I'm trying to do the following: After performing a regex group search, I'm trying to assign the results to the class properties by a specific order. the number of results from the regex search varies from 1-5 values.

class Classification():     def __init__(self, Entry):         self.Entry = Entry         self.Section = ''         self.Class = 'Null'         self.Subclass = 'Null'         self.Group = 'Null'         self.Subgroup = 'Null'       def ParseSymbol(self,regex):          Properties_Pointers = [self.Section,self.Class,self.Subclass,self.Group,self.Subgroup]          Pattern_groups = re.search(regex, self.Symbol)          i = 0         for group in Pattern_groups.groups():             Properties_Pointers[i] = group             i += 1 

the problem is that for each loop iteration, instead of the class property, Properties_Pointers[i] gets the property's value (and of course in this case I can't assign the desired value to the property).

thanks.

回答1:

Refer to attribute names instead, and use the setattr() function to store a new value on self:

def ParseSymbol(self, regex):     attributes = ['Section', 'Class', 'Subclass', 'Group', 'Subgroup']      Pattern_groups = re.search(regex, self.Symbol)      for group, attr in zip(Pattern_groups.groups(), attributes):         setattr(self, attr, group) 

setattr() lets you set attributes based on a variable, here taking from attributes; there is also a companion getattr() function to retrieve attributes dynamically.



回答2:

setattr() will set the attributes of an object based on a string name. You can rewrite ParseSymbol above:

    def ParseSymbol(self,regex):          Properties_Pointers = ['Section','Class','Subclass','Group','Subgroup']          Pattern_groups = re.search(regex, self.Symbol)          i = 0         for group in Pattern_groups.groups():             setattr(self, Properties_Pointers[i], group)             i += 1 

As a side note, you can iterate over both Pattern_groups.groups() and Pattern_Pointers simultaneously by using zip(). This cleans up the code by removing the index variable i and its incrementation:

        for pointer, group in zip(Properties_Pointers, Pattern_groups.groups()):             setattr(self, pointer, group) 


回答3:

If you know that your regex will always contain the same number of groups, you can just use tuple unpacking:

self.Section, self.Class, self.Subclass,self.Group, self.Subgroup = Pattern_groups.groups() 


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!