对象列表 python
list of objects python
我正在尝试打印一个 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
topic2
VideoName3
VideoURL3
VideoName4
VideoURL4
但我实际上得到的是:
topic1
VideoName1
VideoURL1
VideoName2
VideoURL2
VideoName3
VideoURL3
VideoName4
VideoURL4
topic2
VideoName1
VideoURL1
VideoName2
VideoURL2
VideoName3
VideoURL3
VideoName4
VideoURL4
为什么?我想遍历我的主题列表并打印出每个主题中的每个视频,但是对于每个主题它打印出所有视频???
这是怎么回事?
您创建了 class variables
而不是 instance variables
,每个实例对象都不同。定义你的 class 如下:
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:
Instance variables are for data unique to each instance and class
variables are for attributes and methods shared by all instances of
the class.
编辑:
另一个需要考虑的重要事情是,为什么只有 listOfVideo
对于所有实例都是通用的,而不是 topicName
。这是因为 list
是可变对象,而 string
是不可变对象。
因此对 listOfVideo
所做的任何更改对所有实例都是通用的,即它们仍然引用 topic
命名空间中定义的 listOfVideo
。
但是,当您执行 topic1.topicName = 'topic1'
时,您会在 topic1
命名空间中创建一个新变量 topicName
,它会覆盖 topic
中的 topicName
(class) 命名空间。您可以通过打印值 topic.topicName
来确认它,您会发现它是一个空字符串,即 ''
.
我正在尝试打印一个 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
topic2
VideoName3
VideoURL3
VideoName4
VideoURL4
但我实际上得到的是:
topic1
VideoName1
VideoURL1
VideoName2
VideoURL2
VideoName3
VideoURL3
VideoName4
VideoURL4
topic2
VideoName1
VideoURL1
VideoName2
VideoURL2
VideoName3
VideoURL3
VideoName4
VideoURL4
为什么?我想遍历我的主题列表并打印出每个主题中的每个视频,但是对于每个主题它打印出所有视频???
这是怎么回事?
您创建了 class variables
而不是 instance variables
,每个实例对象都不同。定义你的 class 如下:
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:
Instance variables are for data unique to each instance and class variables are for attributes and methods shared by all instances of the class.
编辑:
另一个需要考虑的重要事情是,为什么只有 listOfVideo
对于所有实例都是通用的,而不是 topicName
。这是因为 list
是可变对象,而 string
是不可变对象。
因此对 listOfVideo
所做的任何更改对所有实例都是通用的,即它们仍然引用 topic
命名空间中定义的 listOfVideo
。
但是,当您执行 topic1.topicName = 'topic1'
时,您会在 topic1
命名空间中创建一个新变量 topicName
,它会覆盖 topic
中的 topicName
(class) 命名空间。您可以通过打印值 topic.topicName
来确认它,您会发现它是一个空字符串,即 ''
.