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)
