【问题标题】:Python - Class method returns Object. How to the read object data? [duplicate]Python - 类方法返回对象。如何读取对象数据? [复制]
【发布时间】:2020-09-06 11:46:40
【问题描述】:

学习python和作者没有展示打印Class方法输出的部分。作者只是想演示一下我们可以在哪里使用地图功能。

但我正试图弄清楚如何打印它返回的内容。

class User:
  def __init__(self, username, password):
    self.username = username
    self.password = password
  
  @classmethod
  def from_dict(cls, data):
    return cls(data['username'], data['password'])


users = [
  { 'username': 'rolf', 'password': '123'},
  { 'username': 'teclado', 'password': '1234'}
]


user = [User.from_dict(user) for user in users]
print(user)

或将其打印到终端

user = map(User.from_dict, users)
print(user)

它打印一个参考。我想实际查看数据。

[<__main__.User object at 0x7f54b5e02b80>, <__main__.User object at 0x7f54b5e02d00>]
<map object at 0x7f54b5e02d60>

【问题讨论】:

标签: python


【解决方案1】:

要么:

  1. print的属性直接绕过相当无用的默认repr

    print(user.username, user.password)
    

    或者...

  2. 为该类定义一个__repr__,以便它print(user)(或只是在REPL中回显)有一个有用的字符串形式来显示:

     class User:
         # ... rest of class ...
         def __repr__(self):
             return '{0.__class__.__name__}({0.username!r}, {0.password!r})'.format(self)
    

【讨论】:

    【解决方案2】:

    选项 1:在类的元类中实现 str() 或 repr()

    这个选项更可取。

    class User:
        def __init__(self, username, password):
            self.username = username
            self.password = password
    
        @classmethod
        def from_dict(cls, data):
            return cls(data['username'], data['password'])
    
        def __str__(self):
            return f'username : {self.username}, password : {self.password}'
    
        def __repr__(self):
            return f'User(username={self.username}, password={self.password})'
    
    users = [
        {'username': 'rolf', 'password': '123'},
        {'username': 'teclado', 'password': '1234'}
    ]
    
    user = [User.from_dict(user) for user in users]
    # [username : rolf, password : 123, username : teclado, password : 1234]
    print([u for u in user])
    

    选项 2:使用类 __dict__

    仅当您无法更改原始类时。

    class User:
        def __init__(self, username, password):
            self.username = username
            self.password = password
    
        @classmethod
        def from_dict(cls, data):
            return cls(data['username'], data['password'])
    
    users = [
        {'username': 'rolf', 'password': '123'},
        {'username': 'teclado', 'password': '1234'}
    ]
    
    user = [User.from_dict(user) for user in users]
    # [{'username': 'rolf', 'password': '123'}, {'username': 'teclado', 'password': '1234'}]
    print([u.__dict__ for u in user])
    

    【讨论】:

    • 您对__str____repr__ 的实现是倒退的; repr 通常应该产生一些你可以 eval 重现实例的东西,而 str 是“人性化”版本;您的代码颠倒了这种关系。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-04
    • 1970-01-01
    • 2019-10-13
    • 1970-01-01
    • 2011-08-26
    • 2023-04-01
    相关资源
    最近更新 更多