python对json的操作总结分分快三计划

作者:编程技术

 

python魔法方法-属性转换和类的表示详解,python详解

类型转换魔法

类型转换魔法其实就是实现了str、int等工厂函数的结果,通常这些函数还有类型转换的功能,下面是一些相关的魔法方法:

•__int__(self)

•转换成整型,对应int函数。

•__long__(self)

•转换成长整型,对应long函数。

•__float__(self)

•转换成浮点型,对应float函数。

•__complex__(self)

•转换成 复数型,对应complex函数。

•__oct__(self)

•转换成八进制,对应oct函数。

•__hex__(self)

•转换成十六进制,对应hex函数。

•__index__(self)

•首先,这个方法应该返回一个整数,可以是int或者long。这个方法在两个地方有效,首先是 operator 模块中的index函数得到的值就是这个方法的返回值,其次是用于切片操作,下面会专门进行代码演示。

•__trunc__(self)

•当 math.trunc(self) 使用时被调用.__trunc__返回自身类型的整型截取 (通常是一个长整型).

•__coerce__(self, other)

•实现了类型的强制转换,这个方法对应于 coerce 内建函数的结果(python3.0开始去掉了此函数,也就是该魔法方法也没意义了,至于后续的版本是否重新加入支持,要视官方而定。)

•这个函数的作用是强制性地将两个不同的数字类型转换成为同一个类型,例如:

分分快三计划 1

方法返回一个元祖,分别对应转换后的两个数字。其优先级为:复数>浮点数>长整型>整型。在转换的时候,会转换为两个参数中优先级高的类型。当转换无法完成的时候,会触发 TypeError。

而当我们定义这个魔法方法时,如果转换无法完成,应该返回None。

这里有个重要的机制,当python进行运算的时候,如 1 1.0 时,会先调用 coerce 函数将其转换为同一个类型,然后再进行运行,这也就是为什么 1 1.0 = 2.0,因为转换之后实际进行的运算为 1.0 1.0。得到这样的结果也就不奇怪了。

代码示例:

class Foo(object):
  def __init__(self, x):
    self.x = x

  def __int__(self):
    return int(self.x)   1

  def __long__(self):
    return long(self.x)   1

a = Foo(123)
print int(a)
print long(a)
print type(int(a))
print type(long(a))

分分快三计划 2

这里要注意一点,魔法方法的返回值必须符合预期,例如 __int__ 就应该返回一个 int 类型,如果我们任性地返回其他类型,例如字符串(str)、列表(list)等,会报错。

def __int__(self):
    return str(self.x)

分分快三计划 3

def __int__(self):
    return list(self.x)

分分快三计划 4

但是 int 可以返回 long,而 long 返回 int 时会自动被处理成 long:

class Foo(object):
  def __init__(self, x):
    self.x = x

  def __int__(self):
    return long(self.x)   1

  def __long__(self):
    return int(self.x)   1

a = Foo(123)
print int(a)
print long(a)
print type(int(a))
print type(long(a))

分分快三计划 5

以上发生在python2.7.11上,这是一个很奇怪的行为,以至于我认为其可能是一个 BUG,总之我们在使用的时候要注意要返回对应的类型就是了,以免出错。

__index__(self):

首先是对应于operator.index(),operator.index(a)就相当于a.__index__():

import operator

class Foo(object):
  def __init__(self, x):
    self.x = x

  def __index__(self):
    return self.x   1

a = Foo(10)
print operator.index(a)

分分快三计划 6

另一个是很神奇的特效,当其用于序列中时:

class Foo(object):
  def __init__(self, x):
    self.x = x

  def __index__(self):
    return 3

a = Foo('scolia')
b = [1, 2, 3, 4, 5]
print b[a]
print b[3]

分分快三计划 7

可以作为索引一样使用,可进行切片操作:

class Foo(object):
  def __init__(self, x):
    self.x = x

  def __index__(self):
    return int(self.x)

a = Foo('1')
b = Foo('3')
c = [1, 2, 3, 4, 5]
print c[a:b]

 分分快三计划 8

其实切片内部使用的函数 slice 对其进行了处理,有兴趣的同学可以去了解这个函数:

a = Foo('1')
b = Foo('3')
c = slice(a, b)
print c
d = [1, 2, 3, 4, 5]
print d[c]

 __coerce__(self, other):

代码示例:

class Foo(object):
  def __init__(self, x):
    self.x = x

  def __coerce__(self, other):
    return self.x, str(other.x)

class Boo(object):
  def __init__(self, x):
    self.x = x

  def __coerce__(self, other):
    return self.x, int(other.x)

a = Foo('123')
b = Boo(123)
print coerce(a, b)
print coerce(b, a)

分分快三计划 9

 总结:是调用了第一个参数的魔法方法。

类的表示 :

类的表示其实就是对外的特征,例如使用print语句时,打印出来的是什么,其实本质上也是对应函数的输出:

•__str__(self)

•定义当 str() 被你的一个类的实例调用时所要产生的行为。因为print默认调用的就是str()函数。

•__repr__(self)

•定义当 repr()  被你的一个类的实例调用时所要产生的行为。 str() 和 repr() 的主要区别是其目标群体。 repr() 返回的是机器可读的输出,而 str() 返回的是人类可读的。  repr() 函数是交换模式默认调用的

•函数。

•__unicode__(self)

•定义当 unicode() 被你的一个类的实例调用时所要产生的行为。 unicode() 和 str() 很相似,但是返回的是unicode字符串。注意,如果对你的类调用 str() 然而你只定义了 __unicode__() ,那么其将不会

•工作。你应该定义 __str__() 来确保调用时能返回正确的值,并不是每个人都有心情去使用unicode()。

•__format__(self, formatstr)

•定义当你的一个类的实例被用来用新式的格式化字符串方法进行格式化时所要产生的行为。例如, "Hello, {0:abc}!".format(a) 将会导致调用 a.__format__("abc") 。这对定义你自己的数值或字符串类型

•是十分有意义的,你可能会给出一些特殊的格式化选项。

•__hash__(self)

•定义当 hash()被你的一个类的实例调用时所要产生的行为。它必须返回一个整数,用来在字典中进行快速比较。

•请注意,实现__hash__时通常也要实现__eq__。有下面这样的规则:a == b 暗示着 hash(a) == hash(b) 。也就是说两个魔法方法的返回值最好一致。

•这里引入一个‘可哈希对象'的概念,首先一个可哈希对象的哈希值在其生命周期内应该是不变的,而要得到哈希值就意味要实现__hash__方法。而哈希对象之间是可以比较的,这意味着要实现__eq__或

•者__cmp__方法,而哈希对象相等必须其哈希值相等,要实现这个特性就意味着__eq__的返回值必须和__hash__一样。

•可哈希对象可以作为字典的键和集合的成员,因为这些数据结构内部使用的就是哈希值。python中所有内置的不变的对象都是可哈希的,例如元组、字符串、数字等;而可变对象则不能哈希,例如列表、

•字典等。

•用户定义的类的实例默认是可哈希的,且除了它们本身以外谁也不相等,因为其哈希值来自于 id 函数。但这并不代表 hash(a) == id(a),要注意这个特性。

•__nonzero__(self)

•定义当 bool() 被你的一个类的实例调用时所要产生的行为。本方法应该返回True或者False,取决于你想让它返回的值。(python3.x中改为__bool__)

•__dir__(self)

•定义当 dir() 被你的一个类的实例调用时所要产生的行为。该方法应该返回一个属性的列表给用户。

•__sizeof__(self)

•定义当 sys.getsizeof() 被你的一个类的实例调用时所要产生的行为。该方法应该以字节为单位,返回你的对象的大小。这通常对于以C扩展的形式实现的Python类更加有意义,其有助于理解这些扩展。

这里并没有什么特别难以理解的地方,所以代码例子就略去了。

以上这篇python魔法方法-属性转换和类的表示详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持帮客之家。

类型转换魔法 类型转换魔法其实就是实现了str、int等工厂函数的结果,通常这些函数还...

 

结果:

关于python字符串的处理问题,如果深入的研究下去,我觉得可以写2篇文章了(实际上自己还没整很明白),在这里主要还是总结下使用python2.7.11处理json数据的问题。前期做接口测试,处理最多的事情就是,把数据组装成各种协议的报文,然后发送出去。然后对返回的报文进行解析,后面就遇到将数据封装在json内嵌入在http的body内发送到web服务器,然后服务器处理完后,返回json数据结果的问题。在这里面就需要考虑json里有中文数据,怎么进行组装和怎么进行解析,以下是基础学习的一点总结:

实现:如果可以转换成,int型直接反回转换后的值,如果无法转换,反回False

 

那么我们就利用无法转换的情况,会报类型错误来写这个函数。

 

 

分分快三计划 10

我们所说字符串转成整型是这样的。

 

调用:

分分快三计划 11

print to_int('str')
print to_int('str123')
print to_int('12.12')
print to_int('234')
print to_int('12#$%%')

分分快三计划 12

我们自己写一个函数,来实现这个转换。

Json处理中文问题:

 

 

 

其他参数的使用都是一样的。以下是部分学习的代码片段:

s = "12"
s = "12.12"

 

 

第二:字符串在Python内部的表示是unicode编码,因此,在做编码转换时,通常需要以unicode作为中间编码,即先将其他编码的字符串解码(decode)成unicode,再从unicode编码(encode)成另一种编码。decode的作用是将其他编码的字符串转换成unicode编码,如str1.decode('gb2312'),表示将gb2312编码的字符串str1转换成unicode编码。encode的作用是将unicode编码转换成其他编码的字符串,如str2.encode('gb2312'),表示将unicode编码的字符串str2转换成gb2312编码。因此,转码的时候一定要先搞明白,字符串str是什么编码,然后decode成unicode,然后再encode成其他编码

python学习3群:563227894

从上面2个例子的测试结果可以看到,python的一些基本类型通过encode之后,tuple类型就转成了list类型了,再将其转回为python对象时,list类型也并没有转回成tuple类型,而且编码格式也发生了变化,变成了Unicode编码。具体转化时,类型变化规则如下所示:

 

image

将字符串转换成,整型,从字面理解很容易让人误会。

 

def to_int(str):
    try:
        int(str)
        return int(str)
    except ValueError: #报类型错误,说明不是整型的
        try:
            float(str) #用这个来验证,是不是浮点字符串
            return int(float(str))
        except ValueError:  #如果报错,说明即不是浮点,也不是int字符串。   是一个真正的字符串
            return False

style="font-family: "Microsoft YaHei"; font-size: 14pt">Skipkeys:默认值是False,如果dict的keys内的数据不是python的基本类型(str,unicode,int,long,float,bool,None),设置为False时,就会报TypeError的错误。此时设置成True,则会跳过这类key

style="font-family: "Microsoft YaHei"; font-size: 14pt">ensure_ascii:默认值True,如果dict内含有non-ASCII的字符,则会类似uXXXX的显示数据,设置成False后,就能正常显示

style="font-family: "Microsoft YaHei"; font-size: 14pt">indent:应该是一个非负的整型,如果是0,或者为空,则一行显示数据,否则会换行且按照indent的数量显示前面的空白,这样打印出来的json数据也叫pretty-printed json

style="font-family: "Microsoft YaHei"; font-size: 14pt">separators:分隔符,实际上是(item_separator, dict_separator)的一个元组,默认的就是(',',':');这表示dictionary内keys之间用“,”隔开,而KEY和value之间用“:”隔开。

style="font-family: "Microsoft YaHei"; font-size: 14pt">encoding:默认是UTF-8,设置json数据的编码方式。

style="font-family: "Microsoft YaHei"; font-size: 14pt">sort_keys:将数据根据keys的值进行排序。

思想:python提供转换成整型用int()这关键字,那么,如果我这样int('12') int(12.12)这样是可以转成整型的。但是如果int('abc') int('12.12') 会报类型错误

第三:将json数据转换成python数据后,一般会得到一个dict类型的变量,此时内部的数据都是unicode编码,所以中文的显示看着很痛苦,但是对于dict得到每个key的value后,中文就能正常显示了,如下所示:

比如,要把这个"abcabc"转换成整型,臣妾做不到啊。除成转成ascii。

Json-->Python

D:Python27python.exe D:/HttpRunnerManager-master/HttpRunnerManager-master/test.py
False
False
12
234
False

Json API 使用:python在版本2.6之前,是需要先下载包,安装后才能使用的,有点类似现在的RF内使用SeleniumLibrary一样。但是在2.6中,官方文档(https://docs.python.org/2.6/whatsnew/2.6.html)明显指出,“有一些重要的新的软件包添加到了标准库,比如multiprocessing 和json,但是跟python 3比,2.6的这些包不会引进更多的新功能。"于是安装python2.6以上版本的童鞋,可以不需要下载json包,直接在所需的地方就import json 即可使用,在安装目录下的Lib 下,看到这两个包(点进去仔细阅读这些源码,会有更多的收获,)如下文所示:

 

 

分分快三计划 13

 

 

运行结果:

Python-->Json

Encode过程,是把python对象转换成json对象的一个过程,常用的两个函数是dumps和dump函数。两个函数的唯一区别就是dump把python对象转换成json对象生成一个fp的文件流,而dumps则是生成了一个字符串:

实际上就是对函数的参数的一个理解过程,下面列出几个常用的参数:

>>> import json
>>> data = {"spam" : "foo", "parrot" : 42}
>>> in_json = json.dumps(data) # Encode the data
>>> in_json
'{"parrot": 42, "spam": "foo"}'
>>> json.loads(in_json) # Decode into a Python object
{"spam" : "foo", "parrot" : 42}

分分快三计划 14

 

 

第一:Python 2.7.11的默认编码格式是ascii编码,而python3的已经是unicode,在学习编解码的时,有出现乱码的问题,也有出现list或者dictionary或者tuple类型内的中文显示为unicode的问题。出现乱码的时候,应该先看下当前字符编码格式是什么,再看下当前文件编码格式是什么,或者没有设置文件格式时,查看下IDE的默认编码格式是什么。最推崇的方式当然是每次编码,都对文件编码格式进行指定,如在文件前 设置# coding= utf-8。

dic1 = {'type':'dic1','username':'loleina','age':16}
json_dic1 = json.dumps(dic1)
print json_dic1
json_dic2 = json.dumps(dic1,sort_keys=True,indent =4,separators=(',', ': '),encoding="gbk",ensure_ascii=True )
print json_dic2

image

分分快三计划 15

运行结果如下:

 

 

if __name__ == '__main__':
    # 将python对象test转换json对象
    test = [{"username":"测试","age":16},(2,3),1]
    print type(test)
    python_to_json = json.dumps(test,ensure_ascii=False)
    print python_to_json
    print type(python_to_json)

    # 将json对象转换成python对象
    json_to_python = json.loads(python_to_json)
    print json_to_python
    print type(json_to_python)

 

分分快三计划 16

 

 

 

运行结果如下所示:

分分快三计划 17

如果把实例中的key'username'的value换成中文的“测试”,则用第一次不加参数转换则会报错,但是用第二个加参数的就能正常运行。

分分快三计划 18

Json简介:Json,全名 JavaScript Object Notation,是一种轻量级的数据交换格式。Json最广泛的应用是作为AJAX中web服务器和客户端的通讯的数据格式。现在也常用于http请求中,所以对json的各种学习,是自然而然的事情。Python的官网网址:https://docs.python.org/2/library/json.html?highlight=json#module-json

 

# coding= utf-8
import json
import sys

if __name__ == '__main__':
    # 将python对象test转换json对象
    test = {"username":"测试","age":16}
    print type(test)
    python_to_json = json.dumps(test,ensure_ascii=False)
    print python_to_json
    print type(python_to_json)

    # 将json对象转换成python对象
    json_to_python = json.loads(python_to_json)
    print type(json_to_python)
    print json_to_python['username']

 

Decode过程,是把json对象转换成python对象的一个过程,常用的两个函数是loads和load函数。区别跟dump和dumps是一样的。

 

Python2.6 以上版本支持Json的编码和解码,支持python的大部分内置类型与Json进行转换。最简单的例子如下所示:

本文由分分快三计划发布,转载请注明来源

关键词: 分分快三计划 python