精华内容
下载资源
问答
  • Python中对象转Json

    千次阅读 2018-12-22 15:36:45
    并在其他项目,采用redis缓存进行读取,并由Python进行写入。 这里就简单记录两种语言在读写写Json时候需要注意的点。 Python 的Json.dumps Json模块的dumps方法,用于将对象转化为json格式的string对象, 简单看...

    如何用python和redis交互呢?
    该怎样定义数据存储格式,从而使得数据跨平台使用?当然是Json
    并在其他项目中,采用redis缓存进行读取,并由Python进行写入。

    这里就简单记录两种语言在读写写Json时候需要注意的点。

    Python 的Json.dumps

    Json模块的dumps方法,用于将对象转化为json格式的string对象,
    简单看看dumps的定义:

    def dumps(obj, *, skipkeys=False, ensure_ascii=True, check_circular=True,
            allow_nan=True, cls=None, indent=None, separators=None,
            default=None, sort_keys=False, **kw):
    
    • skipkeys: 标识会跳过某些key,这样就算这些key不是基本类型(str, int, float, bool, None),那么执行dumps方法,也不会抛出异常。
    • ensure_ascii:保证转化后的为ascii码类型
    • default:一个func,函数,用于返回一个可序列化版本的对象,或者raise TypeError,默认就是抛出TypeError
    • indent:为一个非负的整数,表示Json块之间的缩进数,一般为4个空格。

    注意,在Java中,一些成型的库例如jackson,fastjson,都已经帮我们完成了各种转json的骚操作,但是在python中,有些情况则需要手动调用dumps方法来完成转Json。

    多层嵌套对象

    通常,在一个单一的对象中,使用json.dumps可以完成对象转json操作,但是当多个对象签到,
    例如:

    class Father(object):
        """dto"""
        def __init__(self, Son1, Son2, Son3, Son4):
            self.Son1= Son1
            self.Son2= Son2
            self.Son3= Son3
            self.Son4= Son4
    

    这样一来,由于Son*不是python中懂得基本类型,所以我们需要自己重写一个方法,手动调用json.dumps,从而完成转化,否则会报序列化错误:

    TypeError: <_io.BytesIO object at 0x7f81c3153728> is not JSON serializable
    

    此时,则需要往Father中,增加一个方法,手动实现对json.dumps的调用即可:

        def to_json(self):
            return json.dumps(self, default=lambda o: o.__dict__,
                              sort_keys=True, indent=4)
    

    这样完成就是一个标准的json格式了。

    Java中的转化

    在Java方面,使用Spring Data Redis来管理Redis,通常,在一个项目中,会配置一个RedisTemplete:

        @Bean
        public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory factory) {
            StringRedisTemplate template = new StringRedisTemplate(factory);
            Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);
            template.setKeySerializer(new StringRedisSerializer());
            template.setValueSerializer(new Jackson2JsonRedisSerializer);
            return template;
        }
    

    如上,我们可以设置KeySerializer,也可以设置ValueSerilizer,当然,此时,就可以吧Jackson的Serilizer设置进去,此处不过多介绍Jackson的序列化器。另外提一点,如果不设置KeysSerializer,可能会出现乱码情况。

    上面的配置,在一个项目中往往不会出现任何问题,因为项目是统一的,从Java对象到Json,是用这个Serializer,从Json到Java对象,也是这个Serializer,但是,如果不同项目中,需要通过Json来传递某些信息,那么就可能会出问题了。

    可以了解,其实在Jackson中,有几种Serializer,他们的序列化之后的字符串,虽然是json格式,但是却会有某些区别,
    主要有:Jackson2JsonRedisSerializerGenericJackson2JsonRedisSerializer。具体自行理解。

    所以在从redis中读取数据时候,需要根据其他语言(例如python)写入的格式,进行解码,必要时需要重写一个Serializer进行解码操作:

    例如下面是一个简单地VlueSerializer:

    public class PythonJacksonSerializer<T> implements RedisSerializer<T> {
        private final Logger LOGGER = LoggerFactory.getLogger(this.getClass());
    
        private final Charset charset;
        private ObjectMapper objectMapper = new ObjectMapper();
        private Class clazz;
    
        public PythonJacksonSerializer(Charset charset, Class clazz) {
            Assert.notNull(charset, "Charset must not be null!");
            this.charset = charset;
            this.clazz = clazz;
        }
    
        public PythonJacksonSerializer(Class clazz) {
            this(Charset.forName("UTF-8"), clazz);
        }
        @Override
        public byte[] serialize(T t) throws SerializationException {
            if (t == null) {
                return new byte[0];
            }
            try {
                return this.objectMapper.writeValueAsBytes(t);
            } catch (Exception ex) {
                throw new SerializationException("Could not write JSON: " + ex.getMessage(), ex);
            }
        }
    
        @Override
        public T deserialize(byte[] bytes) throws SerializationException {
            if (bytes == null || bytes.length == 0) {
                return null;
            }
            String jsonStr = new String(bytes, charset);
            try {
                return (T)JSONUtils.json2pojo(jsonStr, this.clazz);
            } catch (Exception e) {
                LOGGER.error("PythonJacksonSerializer occurs error",e.getMessage());
                e.printStackTrace();
            }
            return null;
        }
    }
    
    展开全文
  • Python中对象可以添加属性

    千次阅读 2018-06-28 23:02:27
    转载Python对象与实例对象源码分析 当我在看cifar10_input.py文件read_cifar10方法时,出现了result对象,进行属性赋值result.height = size,但是result是一个object对象,没有height属性,看到上面那个...

    转载Python 类对象与实例对象源码分析

    当我在看cifar10_input.py文件中read_cifar10方法时,出现了result对象,进行属性赋值result.height = size,但是result是一个object对象,没有height属性,看到上面那个帖子才明白原因。

    def read_cifar10(filename_queue):
        class CIFAR10Record(object):
            pass
        result = CIFAR10Record()
    
        label_bytes = 1
        result.height = 32//添加新属性,只属于result
        result.width = 32
        result.depth = 3
        image_bytes = result.height * result.width * result.depth
    
    展开全文
  • Python中对象的引用和共享引用

    千次阅读 2016-10-01 19:14:13
    Python中先创建一个对象,然后再将变量指向所创建的对象。 对于每个对象,都有一个头部信息,在信息中就标记了这个对象的类型信息。每当一个变量名被赋予了一个新的对象,之前那个对象占用的空间就回被回收(如果...

    在Python中先创建一个对象,然后再将变量指向所创建的对象。

    对于每个对象,都有一个头部信息,在信息中就标记了这个对象的类型信息。每当一个变量名被赋予了一个新的对象,之前那个对象占用的空间就回被回收(如果此时这个对象没有被别的变量名或者对象所引用的话)。另外,在python中,每个对象都保有一个计数器,计数器中记录了这个对象被引用的次数,当这个计数器被置为0时,对象所占用的内存空间就会被释放,即当做垃圾回收。

    共享引用:

    在python中,变量总是一个指向对象的指针,而不是可以改变的内存区域标签。给一个变量赋予一个新的值,不是替换了原始的对象,而是让这个变量去引用一个新的对象,实际效果就是对变量重新赋值,这仅仅会影响到那个被重新赋值的变量。

    另外,在这里说一下 “ == ”和“ is ”这个操作符

    ==,和C语言中的作用是一样的,测试两个被引用的对象的值是否一致;

    is,检查两个对象的同一性,判断两个对象名是否指向同一地址空间,如果是则返回True。如图,



    创建两个列表对象,即使它们的值相同,也是来源于不同的空间。因此is的比较结果为假

    也许有的朋友测试了一个如上图的例子,结果 is 竟然返回True。这不是代表它们是指向同一个对象,而是在内存中,小的整数和字符串被缓存复用了,所以is才告诉我们a和b是引用了相同的对象。


    展开全文
  • python中对象排序的两种方式

    万次阅读 2017-03-08 14:35:03
    很多时候,我们是需要针对对象序列进行排序的,尤其是针对对象的某个属性排序的场景最为常见。以下就实验两种方法来满足这个需求。1.直接调用序列的sort方法class Person(object): def __init__(self,age,name): ...

    项目github地址:bitcarmanlee easy-algorithm-interview-and-practice
    欢迎大家star,留言,一起学习进步

    很多时候,我们是需要针对对象序列进行排序的,尤其是针对对象的某个属性排序的场景最为常见。以下就实验两种方法来满足这个需求。

    1.直接调用序列的sort方法

    class Person(object):
    
        def __init__(self,age,name):
            self.age = age
            self.name = name
    
    
    def personSort():
        persons = [Person(age,name) for (age,name) in [(12,"lili"),(18,"lulu"),(16,"kaka"),(12,"xixi")]]
        persons.sort(cmp=None,key=lambda x:x.age,reverse=False)
        for element in persons:
            print element.age,":",element.name
    

    person对象里两个字段,一个age,一个name。排序的时候按照age来进行。

    2.第二种方式

    def operatorSort():
        persons = [Person(age,name) for (age,name) in [(12,"lili"),(18,"lulu"),(16,"kaka"),(12,"xixi")]]
        try:
            import operator
        except ImportError:
            cmpfun = lambda x:x.age
        else:
            cmpfun = operator.attrgetter("age","name")
    
        persons.sort(key = cmpfun, reverse=False)
        for element in persons:
            print element.age,":",element.name
    

    使用operator模块的attrgetter方法,可以达到同时对几个字段排序的目的。本例中就是先对age字段排序,如果age相等再按name排序。

    展开全文
  • python 中对象属性的外部添加方法

    千次阅读 2018-08-06 22:16:04
    1、给对象添加属性可以在类的外部进行添加。实现途径就是 '对象名' +'.'+'属性名' = '属性' 的赋值语句方式实现。   如:定义一个Cat 类,利用Cat类创造一个的对象tom,给tom添加一个name属性,代码实现如下: ...
  • python中,变量赋值实际上是简单的对象引用。在创建一个对象后,再把它赋给另一个变量的时候,python并没有拷贝这个对象,而只是简单地拷贝了这个对象的引用。 (1)原子类型的赋值 &gt;&gt;&gt; ...
  • Python是面向对象程序设计(Object Oriented Programming, OOP),其思想主要针对大型软件设计而提出。 其软件设计更加灵活,能够很好地支持代码复用和设计复用。 并且使得代码具有更好的可读性和可扩展性。 面向对象...
  • 在一个类的方法或属性用单下划线开头就是告诉别的程序这个属性或方法是私有的。然而对于这个名字来说并没有什么特别的。 引自PEP-8: 单下划线:"内部使用"的弱指示器。比如,from M import * 将不会引进用...
  • 方法1:(仅限python 2) 1)string.atof(s) 字符串转化成浮点型 >>import string >>string.atof('1.11') >>1.11 >>string.atof('1') >>1.0 2)string.atoi(s[, base]) 字符串...
  • 最近学习python的时候又看到了这个运算符,于是便了解了一下python中对象比较相关的知识,特此分享。(根据python版本不同可能会有些许不同) 一、对象的要素 python中对象包含三个基本要素,分别是: id...
  • Python中对象赋值与拷贝

    千次阅读 2017-09-06 23:15:31
    简单说明了Python中对象的赋值与拷贝。
  • Python中对象对象

    千次阅读 2017-07-05 16:18:25
    今天我们介绍Python中对象对象名:Python中所有的变量都是对象对象在python里,其实是一个指针,指向一个数据结构,数据结构里有属性,有方法。对象通常就是指变量。从面向对象OO的概念来讲,对象是类的一个...
  • python面向对象

    千人学习 2017-03-03 17:35:42
    到这一部分,我们真正开始学习什么是面向对象的设计哲学,课程主要涉及类和面向对象的概念,类的三大特性:封装,继承,多态以及反射和class特性等,该章节是我们学习python的重之重。
  • Python 面向对象

    万次阅读 2020-02-04 13:13:33
    Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对象是很容易的。本章节我们将详细介绍Python的面向对象编程。 如果你以前没有接触过面向对象的编程语言,那你可能需要先了解一些...
  • Python中对象

    千次阅读 2018-09-05 17:33:06
    Python中对象数据类型主要包含,数值型、字符型、逻辑型、列表、元祖、字典、数据框。 本文将针对不同的数据类型进行介绍,说明其用法。 一、数值型、字符型、逻辑型说明 数值型 定义:数值型主要是指实数...
  • Python面向对象原理与基础语法详解

    千次阅读 2020-02-26 21:59:52
    本文实例讲述了Python面向对象原理与基础语法。...在 Python 对象几乎是无所不在的,我们之前学习的 变量、数据、函数 都是对象Python 可以使用以下两个方法验证: 在 标识符 / 数据 后输入一个 .,然后按...
  • Python3的json对象python对象转化

    千次阅读 2019-04-13 09:18:35
    1.直接将Python对象转成json对象,使用方法dumps() import json d = {"姓名": "curry", "age": 30, "hobby": "basketball"} d_json = json.dumps(d, ensure_ascii=False) print("json对象d_json: ", d_json) 2....
  • python中对象 一级对象?

    千次阅读 2017-09-03 14:08:31
    一、python对象  python使用对象模型来存储数据。构造任何类型的值都是一个对象。  所有python对象都拥有三个特性:身份、类型、值  身份:每个对象都有一个唯一的身份标识自己,任何对象的身份可以使用内建...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 76,341
精华内容 30,536
关键字:

python中对象

python 订阅