如何解决Python-如何从另一个类返回实例的值?
我有4个课程:
1-书籍(平装书和电子书的超类) 2-纸质书 3-电子书 4-图书馆(该类用于创建来自Paperbook和eBook的书籍列表)
将myEBook和myPaperbook附加到self.books列表后,如何返回我附加的书列表?目前,我只得到对象引用(即[ main .eBook对象位于0x1023e6e80>, main .Paperbook对象位于0x1023e6eb8>])
class Book:
def __init__(self,title,author):
self.title = title
self.author = author
def __str__(self):
return '"{}" by {}'.format(self.title,self.author)
class Paperbook(Book):
def __init__(self,author,numPages):
Book.__init__(self,author)
self.numPages = numPages
class eBook(Book):
def __init__(self,size):
Book.__init__(self,author)
self.size = size
class Library:
def __init__(self):
self.books = []
def addBook(self,book):
self.books.append(book)
def getNumBooks(self):
return len(self.books)
def __str__(self):
return 'The book list: {}'.format(self.books)
myEBook = eBook('The Odyssey','Homer',2)
print(myEBook,myEBook.size,'MB big')
myPaperbook = Paperbook('The Odyssey',500)
print(myPaperbook,myPaperbook.numPages,'pages long')
booksLibrary = Library()
booksLibrary.addBook(myEBook)
booksLibrary.addBook(myPaperbook)
print(booksLibrary.getNumBooks())
print(booksLibrary)
解决方法
您也指定了__repr__(self):
。在打印项目列表时,python将使用__repr__()
的输出表示列表中的每个项目。
您可以通过将__repr__
的输出默认为与__str__
的输出相同来修复输出,如下所示:
class Book:
def __init__(self,title,author):
self.title = title
self.author = author
def __str__(self):
return '"{}" by {}'.format(self.title,self.author)
def __repr__(self): return str(self)
class Paperbook(Book):
def __init__(self,author,numPages):
Book.__init__(self,author)
self.numPages = numPages
def __str__(self):
return f'"{self.title}" by {self.author} ({self.numPages} pages)'
def __repr__(self): return str(self)
class eBook(Book):
def __init__(self,size):
Book.__init__(self,author)
self.size = size
def __str__(self):
return f'"{self.title}" by {self.author} ({self.size} MB)'
def __repr__(self): return str(self)
class Library:
def __init__(self):
self.books = []
def addBook(self,book):
self.books.append(book)
def getNumBooks(self):
return len(self.books)
def __str__(self):
return 'The book list: {}'.format(self.books)
myEBook = eBook('The Odyssey','Homer',2)
print(myEBook,myEBook.size,'MB big')
myPaperbook = Paperbook('The Odyssey',500)
print(myPaperbook,myPaperbook.numPages,'pages long')
booksLibrary = Library()
booksLibrary.addBook(myEBook)
booksLibrary.addBook(myPaperbook)
print(booksLibrary.getNumBooks())
print(booksLibrary)
输出:
"The Odyssey" by Homer (2 MB) 2 MB big
"The Odyssey" by Homer (500 pages) 500 pages long
2
The book list: ["The Odyssey" by Homer (2 MB),"The Odyssey" by Homer (500 pages)]
如果您对输出进行更多的样式设置,而不是简单地打印类的列表成员,则可能会带来更好的用户体验:
class Library: # removed identical methods
def __str__(self):
ordered = sorted(self.books,key = lambda b: (b.author,b.title))
max_title = 0
max_author = 0
for b in ordered:
max_title = max(len(b.title),max_title)
max_author = max(len(b.author),max_author)
return '\n- '.join(['The book list:'] + [str(o) for o in ordered])
# create a random library
import random
# titles
titles = [f"A book about {x}" for x in ("cooking","booking","looking","spooking","crooking","brooding","weeding","growing","mowing")]
# names from module names,inlined to remove dependency
authors = ['Michael Paul','Brian Torres','David Evans','Amy Kramp','Robert Ray','Darin Winkler','Mary Schoettmer','Sharon Evans','Keri Rohman']
lib = Library()
# create stocked books
for _ in range(3):
ti = random.choices(titles,k=3)
au = random.choices(authors,k=3)
for a,t in zip(au,ti):
size = random.randint(2,8)
lib.addBook(eBook(t,a,size))
lib.addBook(Paperbook (t,size*123))
# print em
print(lib)
输出:
- "A book about booking" by Amy Kramp (3 MB)
- "A book about booking" by Amy Kramp (369 pages)
- "A book about looking" by Darin Winkler (8 MB)
- "A book about looking" by Darin Winkler (984 pages)
- "A book about weeding" by Darin Winkler (2 MB)
- "A book about weeding" by Darin Winkler (246 pages)
- "A book about weeding" by Darin Winkler (3 MB)
- "A book about weeding" by Darin Winkler (369 pages)
- "A book about cooking" by Keri Rohman (7 MB)
- "A book about cooking" by Keri Rohman (861 pages)
- "A book about weeding" by Keri Rohman (2 MB)
- "A book about weeding" by Keri Rohman (246 pages)
- "A book about weeding" by Michael Paul (2 MB)
- "A book about weeding" by Michael Paul (246 pages)
- "A book about looking" by Robert Ray (3 MB)
- "A book about looking" by Robert Ray (369 pages)
- "A book about growing" by Sharon Evans (4 MB)
- "A book about growing" by Sharon Evans (492 pages)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。