use*_*340 9 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)
Run Code Online (Sandbox Code Playgroud)
我期望得到的是:
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
为什么?我想迭代我的主题列表并在每个主题中打印出每个视频,但对于每个主题,它打印出所有视频???
这里发生了什么?
shi*_*iva 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
Run Code Online (Sandbox Code Playgroud)
从Python教程:
实例变量用于每个实例的唯一数据,而类变量用于所有类实例共享的属性和方法.
编辑:
另一个需要考虑的重要事项是,为什么只有listOfVideo所有实例都是常见但不是topicName.这是因为list它们是可变对象,而string它们是不可变的.
因此,所做的任何更改listOfVideo对于所有实例都是通用的,即它们仍然引用命名空间中listOfVideo定义的topic.
但是,当您这样做时topic1.topicName = 'topic1',您将topicName在topic1命名空间中创建一个新变量,该变量将覆盖(类)命名空间中的topicName找到的变量topic.你可以通过打印值来确认它topic.topicName,你会发现它是一个空字符串,即''.