список объектов 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
почему? Я хочу повторить свой список тем и распечатать каждое видео в каждой теме, но для каждой темы он распечатывает все видео???
что здесь происходит?
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
переменные экземпляра предназначены для данных, уникальных для каждого экземпляра и класса переменные атрибуты и методы, общие для всех экземпляров класс.
EDIT:
еще одна важная вещь, чтобы рассмотреть вот почему только listOfVideo
было общим для всех случаев, но не topicName
. Это потому что list
изменяемые объекты в то время как string
неизменны.
поэтому любые изменения, внесенные в listOfVideo
являются общими для всех экземпляров, т. е. они по-прежнему относятся к listOfVideo
определена в topic
пространство имен.
однако, когда вы делаете topic1.topicName = 'topic1'
, вы создаете новую переменную topicName
внутри topic1
пространство имен, которое переопределяет topicName
нашли в topic
(имя класса). Вы можете подтвердить его печать значения topic.topicName
, который вы найдете пустой строкой, т. е. ''
.