微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Python-如何从另一个类返回实例的值?

如何解决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 举报,一经查实,本站将立刻删除。