【问题标题】:list of objects python对象列表 python
【发布时间】:2016-11-21 18:44:29
【问题描述】:

我正在尝试打印包含列表作为属性的 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)

期望得到的是:

主题1

视频名称1

视频网址1

视频名称2

视频URL2

主题2

视频名称3

视频URL3

视频名称4

视频URL4

但我实际上得到的是这样的:

主题1

视频名称1

视频网址1

视频名称2

视频URL2

视频名称3

视频URL3

视频名称4

视频URL4

主题2

视频名称1

视频网址1

视频名称2

视频URL2

视频名称3

视频URL3

视频名称4

视频URL4

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

这是怎么回事?

【问题讨论】:

标签: python python-object


【解决方案1】:

您创建了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 所做的任何更改对于所有实例都是通用的,即它们仍然引用在 topic 命名空间中定义的 listOfVideo

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

【讨论】:

  • 啊。谢谢。显然我不知道我班级中的变量是班级变量。现在我知道了,谢谢!
猜你喜欢
  • 1970-01-01
  • 2021-08-18
  • 2011-01-21
  • 2017-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-11
相关资源
最近更新 更多