【问题标题】:Cross-classes manipulations of objects in PythonPython中对象的跨类操作
【发布时间】:2022-08-22 16:06:39
【问题描述】:

我正在尝试用 Python 制作一个简单的库 OOP 程序。结构如下:

具有属性的类书籍(对象)

class Books(object):
    book_id=\"\"
    book_title=\"\"
    Books=[book_id,book_title]
def __init__(self,book_id,book_title):
    self.book_id = book_id
    self.book_title = book_title

#Books=[book_id,book_title]
book2= Books(\'1504231\',\'Murders\')
print(book1.__str__())

类 BookList(Books) 与类 Books 创建的对象

class BookList(Books):
    def __init__(self):
        self.listbook = []
 book_list= BookList()
 book_list.add_book_object(book2)
 book_list.show_books()

(此范围内的操作对我有用)

具有属性的类用户(对象)(类似于书籍的 def 和 init)

user1= Users (\'adfelko\',\'Adam\')
print(user1.__str__())

类 UserList(Users),其对象由类 Users 创建(类似于 BookList 的 def 和 init)

user_list= UserList()
user_list.add_user_object(user1)
user_list.show_users()

(此范围内的操作对我有用)

现在,我正在尝试创建实际的 Lease 类,它将保存对象字典(每个对象=每个租约,每个租约 = [用户对象,书籍对象])

这是我的尝试:

#Definition of class Leases 
class Leases(Users,Books):
#Set constructor
    def __init__(self,user,book):
        self.leases = [user,book]
    #Create a lease       
    def borrow_book_to_user(self,u_name,t_book):
        user=u_name
        book=t_book
        lease = [user,book]
        self.leases.append(lease)
    
    #Show lease
    def __str__(self):
        print(self) 

也许我对使用它有一个不好的概念,不确定,但我可能不应该通过列表 - BookList 和 UserList ? 或者我应该如何连接它并能够调用以前类的函数? 现在的事情是:

lease= Leases(user1,book2)
lease.__str__()

但输出看起来像这样:

[<__main__.Users object at 0x0000010E69BFE280>, <__main__.Books object at 0x0000010E69BFE1F0>]

我想直接输出:

[ [\'adfelko\',\'Adam\'],[\'1504231\',\'Murders\'] ]

有可能从 Leases 类访问和更改此用户或图书对象的属性,有人可以在这里提供帮助吗? 谢谢 此致 更新: @guimoute 感谢您的评论!它没有帮助解决,但帮助我更深入地理解。

我不得不重新考虑我对 Leases 类的使用(其他东西保持不变):

#Definition of class leases 
class Leases():
#Set constructor
    def __init__(self):
        self.leases = []   
    #Create lease object    
    def add_lease_object(self,user,book):
        lease = { user : book}
        self.leases.append(lease)
    #Create lease object    
    def del_lease_object(self,user,book):
        lease = { user : book}
        self.leases.remove(lease)

    #Show lease
    def __str__(self):
        return(self.leases)
    #Show leases
    def show_leases(self):
        for l in self.leases:
            #print(vars(l))
            #json.dump(l,str)
            print(l.__str__()) 

我正在执行:

lease= Leases()
lease.add_lease_object(user1,book2)
#print(lease.__str__())
print(\"*************************\")
lease.show_leases()
print(\"*************************\")
lease.add_lease_object(user2,book3)
print(\"*************************\")
lease.show_leases()
print(\"*************************\")
lease.del_lease_object(user2,book3)
print(\"*************************\")
lease.show_leases()

这似乎工作正常,但它再次没有将嵌套对象的输出显示为字符串值:

{<main.Users object at 0x000001F9BD98E250>: <main.Books object at 0x000001F9BD8F2EB0>}

{<main.Users object at 0x000001F9BD98E250>: <main.Books object at 0x000001F9BD8F2EB0>} {<main.Users object at 0x000001F9BD98ED90>: <main.Books object at 0x000001F9BD98E1F0>}

{<main.Users object at 0x000001F9BD98E250>: <main.Books object at 0x000001F9BD8F2EB0>}

正如您在上面看到的,我什至尝试过:

    #print(vars(l))
    #json.dump(l,str)

但是当尝试访问不同类的嵌套对象时,结果类似。请问你有更好的主意吗?谢谢

  • 好吧,将print(self) 更改为print(self.leases)。此外,您应该返回__str__ 中的字符串值而不是打印它。

标签: python oop


【解决方案1】:

您看到的输出:

{<main.Users object at 0x000001F9BD98E250>: <main.Books object at 0x000001F9BD8F2EB0>} {<main.Users object at 0x000001F9BD98ED90>: <main.Books object at 0x000001F9BD98E1F0>}

是用户和书籍实例的默认文本表示。如果你希望它以不同的方式显示,你只需要在这两个类中重写 __str__ 方法:

class Books(object):
    [...]
    def __str__(self) -> str:
        return "{}, {}".format(self.book_id, self.book_title)

现在,当您直接(如使用 str(book1))或间接调用 Book 和类似的 User 对象的文本表示时,将使用您的 __str__ 方法而不是默认方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-26
    • 1970-01-01
    相关资源
    最近更新 更多