文章内容

2023/3/22 12:31:46,作 者: 黄兵

python __repr__ 作用

__repr__ 是Python类中的一个特殊方法,由object对象提供,由于所有类都是object类的子类,所以都会继承该方法。 它是一个”自我描述“ 的方法,此方法通常实现这样的功能: 当直接打印类的实例化对象时,系统将会输出对象的自我描述信息,用来告诉外界对象具有的状态信息。

例如下面有一个 SQLAlchemy 模型的定义:

class User(UserMixin, db.Model):
    __tablename__ = 'cloud_production_users'
    id = db.Column(db.Integer, primary_key=True)
    email = db.Column(db.String(64), unique=True, index=True)
    username = db.Column(db.String(64), unique=True, index=True)
    role_id = db.Column(db.Integer, db.ForeignKey('cloud_production_roles.id'))
    password_hash = db.Column(db.String(128))
    confirmed = db.Column(db.Boolean, default=False)
    name = db.Column(db.String(64))
    location = db.Column(db.String(64))
    about_me = db.Column(db.String(1024, collation='utf8mb4_unicode_ci', ), comment='关于我')
    member_since = db.Column(db.DateTime(), default=datetime.utcnow)
    last_seen = db.Column(db.DateTime(), default=datetime.utcnow)
    avatar_hash = db.Column(db.String(32))
    
    def __repr__(self):
        return '' % self.username

我们插入数据:

r = Role.query.filter_by(name='User').first()
self.assertIsNotNone(r)
# add a user
u = User(email='john@example.com', password='cat', confirmed=True, role=r)

之后查询,看看结果:


可以看到 UserNone,但是我刚才已经增加了用户数据,且通过 Debug,我们也可以看到有用户数据的。

为什么会是 None 呢?

通过通过观察我们发现 username 也为 None,我们增加 username 的数据,如下:

# add a user
u = User(email='john@example.com', password='cat', username='john', confirmed=True, role=r)

之后再次查询,看看结果:


可以看到这里显示了用户名。

通过上面的实验我们可以看出:它是一个”自我描述“ 的方法,在这个实例中它描述了 username,也就是这一段的内容:

    def __repr__(self):
        return '' % self.username

当直接打印类的实例化对象时,系统将会输出对象的自我描述信息,用来告诉外界对象具有的状态信息。

由于第一次没有设置 username,所以才会导致 User 类显示 None,同时我们设置了 username 之后,第二次显示的是用户名。

是不是明白了?


黄兵个人博客原创。

转载请注明出处:黄兵个人博客 - python __repr__ 作用

分享到:

发表评论

评论列表