先看个例子:
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__
出来的实例。