zoukankan      html  css  js  c++  java
  • Django models中的\_\_repr__方法

    先看个例子:

    class D(object):
        def __init__(self):
            pass
        def __str__(self):
            return "__str__"
        def __repr__(self):
            return "__repr__"
    
    b = D()
    print(b.__repr__())
    print(b)
    

    out:

    __repr__
    __str__
    

    内建函数str()和repr() (representation,表达,表示)或反引号操作符(``)可以方便地以字符串的方式获取对象的内容、类型、数值属性等信息。

    str()函数得到的字符串可读性好(故被print调用),而repr()函数得到的字符串通常可以用来重新获得该对象

    通常情况下 obj==eval(repr(obj)) 这个等式是成立的。这两个函数接受一个对象作为其参数,返回适当的字符串。

    事实上repr()和``做一样的事情,返回一个对象的“官方”字符串表示。其结果绝大多数情况下(不是所有)可以通过求值运算(内建函数eval())重新得到该对象。

    str()则不同,它生成一个对象的可读性好的字符串表示,结果通常无法用eval()求值,但适合print输出。

    为什么有了repr()还需要``?

    Python中,有的操作符和函数是做同样的事情,原因是某些场合下函数会比操作符更适合使用,比如函数对象可作为参数传递。双星号(**)乘方运算和pow()内建函数都返回x的y次方.

    Django中repr方法的使用

    for p in Poll.objects.all():
        print p
    

    一个结果集就是一个可迭代对象.因此,可以通过一个循环来取出它的值,而使用对象的__repr__()方法打印出所有的P对象.

    实用例子:

    ...
    field = cls.base_fields[field_name]
    #print(field.__repr__())
    if 'BooleanField' not in field.__repr__():
        attr_dic = {'class':'form-control',
                    'placeholder':field.help_txt,}
        # if field_name in disabled_fields:
                attr_dic['disabled'] = True
        field.widget.attrs.update(attr_dic)
    return ModelForm.__new__(cls)               
    

    其中:

    • BooleanField,一种字段类型,指布尔型,和NullBooleanField有区别,true/false,本类型不允许出现null。Blank=True
    • __new__:至少要有一个参数cls,代表要实例化的类,此参数在实例化时由Python解释器自动提供。__new__必须要有返回值,返回实例化出来的实例,这点在自己实现__new__时要特别注意,可以return父类__new__出来的实例,或者直接是object的__new__出来的实例。
  • 相关阅读:
    C3线性化
    fingerprint for the ECDSA key
    tmp
    线性筛(欧拉筛)
    tmp
    tmp
    Micro Frontends 微前端
    TreeFrog Framework : High-speed C++ MVC Framework for Web Application http://www.treefrogframework.org
    消息同屏转发
    web-linux-shell实现 阿里方案canvas+wss。
  • 原文地址:https://www.cnblogs.com/ccorz/p/Django-models-zhong-dereprfang-fa.html
Copyright © 2011-2022 走看看