Aug-26-2018, 10:44 AM
is there a way to iterate over python property descriptors rather than
which i know i can do by iterating over the instance's dictionary
the problem is that some of the user values are reused for different property names which is how i want them defined in the output... so is there a way to iterate over only properties instead of
__dict__
attributes?import datetime from datetime import date from datetime import datetime as dt class videofile: def __init__(self): self._date = date.today() self._dateadded = dt.now() self._title = 'New Title' self._plot = '' @property def title(self): return self._title @title.setter def title(self, value): self._title = value @property def plot(self): return self._plot @plot.setter def plot(self, value): self._plot = value @property def dateadded(self): return self._dateadded @dateadded.setter def dateadded(self, value): self._dateadded = value class movie(videofile): def __init__(self): super(movie,self).__init__() self._outline = '' @property def outline(self): return self._outline @outline.setter def outline(self, value): self._outline = value @property def premiered(self): return self._date @premiered.setter def premiered(self, value): self._date = value class tvepisode(videofile): def __init__(self): super(tvepisode,self).__init__() self._season = -1 self._episode = -1 self._absolute = -1 @property def season(self): return self._season @season.setter def season(self, value): self._season = value @property def episode(self): return self._episode @episode.setter def episode(self, value): self._episode = value @property def absolute(self): return self._absolute @absolute.setter def absolute(self, value): self._absolute = value @property def aired(self): return self._date @aired.setter def aired(self, value): self._date = valueI want to iterate over the user values (to eventually shove them into an xml)
which i know i can do by iterating over the instance's dictionary
movieitem = movie() movieitem.title = 'Avengers: Infinity War' movieitem.premiered = date(2018,4,27) movieitem.plot = 'The Avengers and their allies must be willing to sacrifice all in an attempt to defeat the powerful Thanos before his blitz of devastation and ruin puts an end to the universe.' for attribName, attribValue in movieitem.__dict__.items(): if isinstance(attribValue, str): print(attribName + ': ',attribValue ) elif isinstance(attribValue,date): print(attribName + ': ',attribValue.strftime('%Y-%m-%d')) elif isinstance(attribValue,dt): print(attribName + ': ',attribValue.strftime('%Y-%m-%d %H:%M:%S')) else: print(attribName + ': ', str(attribValue))the code above produces:
Output:_title: Avengers: Infinity War
_date: 2018-04-27
_dateadded: 2018-08-26 05:33:21
_outline:
_plot: The Avengers and their allies must be willing to sacrifice all in an attempt to defeat the powerful Thanos before his blitz of devastation and ruin puts an end to the universe
.the problem is that some of the user values are reused for different property names which is how i want them defined in the output... so is there a way to iterate over only properties instead of
__dict__
attributes for instance, the self._date
is used to for different properties in movies (premiered) and tvepisodes (aired)