2016-11-04 48 views
0

我想要定义一个Python类,它通过praw包分析subreddit数据。Python类:数据不知何故丢失

我对C++中的OOP有相当丰富的经验,但在Python中没有太多的OOP经验。这里是我的代码至今:

import praw 
class SubRedditAnalyzer: 

    def __init__(self, reddit_session, name='dataisbeautiful'): 
     self.name = name # subreddit name 
     self.reddit_session = reddit_session # assign the reddit session 
     self.subreddit = self.reddit_session.get_subreddit(self.name) # create the subreddit object 
     self.timeframe = 'day' 
     self.max_post_count = 10 
     self.submissions = self.subreddit.get_top_from_hour(limit=10) 

    def __del__(self): 
     class_name = self.__class__.__name__ 
     print class_name, "destroyed" 

    def get_top_submissions(self, max_post_count): 

     timeframe = self.timeframe 

     if (timeframe == 'hour'): 
      self.submissions = self.subreddit.get_top_from_hour(limit= max_post_count) 
     elif (timeframe == 'day'): 
      self.submissions = self.subreddit.get_top_from_day(limit= max_post_count) 
     elif (timeframe == 'week'): 
      self.submissions = self.subreddit.get_top_from_week(limit= max_post_count) 
     elif (timeframe == 'month'): 
      self.submissions = self.subreddit.get_top_from_month(limit= max_post_count) 
     elif (timeframe == 'year'): 
      self.submissions = self.subreddit.get_top_from_year(limit= max_post_count) 
     elif (timeframe == 'all'): 
      self.submissions = self.subreddit.get_top_from_all(limit= max_post_count) 

    def combine_titles(self): 
     titles = "" 
     for submission in self.submissions: 
      titles += submission.title 
     self.titles = titles 

    def display_titles(self): 
     counter = 1 
     ya = self.submissions 
     for sub in self.submissions: 
      sc = sub.score 
      ti = sub.title 
      print('T%d- [%d] %s \n' %(counter,sc,ti)) 
      counter += 1 

def main(): 
    r = praw.Reddit('Request to fetch data by user') 
    sr = SubRedditAnalyzer(r, 'dataisbeautiful') 
    sr.get_top_submissions(15) # top 15 from reddit 
    sr.combine_titles()  # combine the top titles  
    sr.display_titles()  # display all the titles 

main() 

对于一些未知的(对我)的原因,似乎是在课堂上“SR”中的数据丢失调用后:

sr.combine_titles() 

当我尝试调用此方法,在课堂上的数据是空的:

sr.display_titles() 

其实,我也看到类被破坏的消息:

SubRedditAnalyzer已销毁

什么是我做错了? 提前,感谢您的关注。

+0

我不知道'praw',但你的代码看起来不错,以我和我看不到任何明显为什么'__del__'方法会被过早地调用。 –

+0

当然,这个类在main()方法的末尾被销毁了,这是你应该期望的,不是? –

+0

@ PM2Ring:感谢您的评论。由于我还没有使用Python中的类的经验,我不确定这是否是我做错的事。仅供参考,没有任何课程,此代码工作正常。你有什么建议,我可以如何跟踪这个问题?谢谢。 – MomoPP

回答

2

看起来self.submissions可能是可迭代的,但不是集合(例如列表)。 The docs调用get_top_from_hour() a 生成器方法(尽管他们也声明返回的是列表...)。如果确实是generator method,则结果只能迭代一次。迭代中的所有其他尝试都将自动失败(display_titles()中的循环不执行任何操作)。

所以,解决办法是:

self.submissions = list(self.subreddit.get_top_from_hour(limit=10)) 

__init__()一个迭代转换为永久收藏品(列表),可在多次迭代。

2

根据PRAW文档,get_content及其相关方法如get_top_from_hour返回生成器。一个生成器只能迭代一次,你在combine_titles中做。迭代之后,发生器耗尽并且不能再次迭代。

你可以假设的意见书转换到一个列表,当你让他们在__init__

self.submissions = list(self.subreddit.get_top_from_hour(limit=10)) 
+0

现在完全合理。谢谢你的帮助Daniel。 – MomoPP