对象列表python

时间:2016-07-19 03:03:15

标签: python python-object

我正在尝试打印包含列表作为属性的python对象列表,并且我有一些意想不到的结果:

这是我的代码:

class video(object):

    name = ''
    url = ''

class topic(object):

    topicName = ''
    listOfVideo = []

    def addVideo(self,videoToAdd):
        self.listOfVideo.append(videoToAdd)

    def getTopic(self):
        return self.topicName

    def getListOfVideo(self):
        return self.listOfVideo


topic1 = topic()
topic1.topicName = 'topic1'
video1 = video()
video1.name = 'VideoName1'
video1.url = 'VideoURL1'

video2 = video()
video2.name = 'VideoName2'
video2.url = 'VideoURL2'
topic1.addVideo(video1)
topic1.addVideo(video2)

topic2 = topic()
topic2.topicName = 'topic2'

video3 = video()
video3.name = 'VideoName3'
video3.url = 'VideoURL3'

video4 = video()
video4.name = 'VideoName4'
video4.url = 'VideoURL4'

topic2.addVideo(video3)
topic2.addVideo(video4)

topicsList = []
topicsList.append(topic1)
topicsList.append(topic2)

for topicCurrent in topicsList:
    print(topicCurrent.topicName)
    for video in topicCurrent.getListOfVideo():
        print(video.name)
        print(video.url)

期待 得到的是:

  

TOPIC1

     

VideoName1

     

VideoURL1

     

VideoName2

     

VideoURL2

     

标题2

     

VideoName3

     

VideoURL3

     

VideoName4

     

VideoURL4

实际上 得到的是:

  

TOPIC1

     

VideoName1

     

VideoURL1

     

VideoName2

     

VideoURL2

     

VideoName3

     

VideoURL3

     

VideoName4

     

VideoURL4

     

标题2

     

VideoName1

     

VideoURL1

     

VideoName2

     

VideoURL2

     

VideoName3

     

VideoURL3

     

VideoName4

     

VideoURL4

为什么呢?我想迭代我的主题列表并打印每个主题中的每个视频,但是对于每个主题,它打印出所有视频???

这里发生了什么?

1 个答案:

答案 0 :(得分:10)

您已创建class variables而不是instance variables,这些对于每个实例对象都不同。按如下方式定义您的课程:

class topic(object):

    def __init__(self):
        self.topicName = ''
        self.listOfVideo = []

    def addVideo(self,videoToAdd):
        self.listOfVideo.append(videoToAdd)

    def getTopic(self):
        return self.topicName

    def getListOfVideo(self):
        return self.listOfVideo

来自Python Tutorial

  

实例变量用于每个实例和类的唯一数据   变量用于所有实例共享的属性和方法   上课。

修改

需要考虑的另一个重要事项是,为什么只有listOfVideo对所有实例都是通用的,而不是topicName。这是因为list是可变对象,而string是不可变的。

因此,对listOfVideo所做的任何更改对于所有实例都是通用的,即它们仍然引用listOfVideo命名空间中定义的topic

但是当您执行topic1.topicName = 'topic1'时,在topicName命名空间内创建一个新变量topic1,它会覆盖topicName(类)命名空间中的topic 。您可以通过打印值topic.topicName来确认它,您会发现它是一个空字符串,即''