【问题标题】:Python - How do I return the value of the instance from another class?Python - 如何从另一个类返回实例的值?
【发布时间】:2021-02-20 11:05:25
【问题描述】:

我有 4 节课:

1 - 书籍(Paperbook 和 eBook 的超类) 2 - 纸本 3 - 电子书 4 - 图书馆(这个类是从 Paperbook 和 eBook 创建书籍列表)

将 myEBook 和 myPaperbook 附加到 self.books 列表后,如何返回我附加的书籍列表?目前我只获取对象引用(即 [ma​​in.eBook object at 0x1023e6e80>, ma​​in.Paperbook object at 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, title, author, numPages):
        Book.__init__(self, title, author)
        self.numPages = numPages


class eBook(Book):
    def __init__(self, title, author, size):
        Book.__init__(self, title, 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', 'Homer', 500)
print(myPaperbook, myPaperbook.numPages, 'pages long')

booksLibrary = Library()
booksLibrary.addBook(myEBook)
booksLibrary.addBook(myPaperbook)
print(booksLibrary.getNumBooks())

print(booksLibrary) 

【问题讨论】:

标签: python-3.x class instance-variables


【解决方案1】:

您也指定__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, title, author, numPages):
        Book.__init__(self, title, 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, title, author, size):
        Book.__init__(self, title, 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', 'Homer', 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,a,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)

【讨论】:

  • 感谢您的帮助,帕特里克。字典项目呢?我是否也使用 repr 来返回 dict 值?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-11-14
  • 1970-01-01
  • 2015-06-10
  • 1970-01-01
  • 1970-01-01
  • 2012-11-19
  • 1970-01-01
相关资源
最近更新 更多