美文网首页
如何在Python中表示一个对象

如何在Python中表示一个对象

作者: 阳仔_1f0c | 来源:发表于2019-08-21 09:46 被阅读0次

    关于我
    一个有思想的程序猿,终身学习实践者,目前在一个创业团队任team lead,技术栈涉及Android、Python、Java和Go,这个也是我们团队的主要技术栈。
    Github:https://github.com/hylinux1024
    微信公众号:终身开发者(angrycode)

    Python中一切都是对象。如果要在Python中表示一个对象,除了定义class外还有哪些方式呢?我们今天就来盘点一下。

    0x00 dict

    字典或映射存储KV键值对,它对查找、插入和删除操作都有比较高效率。用一个dict对象可以非常容易的表示一个对象。dict的使用也很灵活,可以修改、添加或删除属性。

    >>> student={
    'name':'jack',
    'age':18,
    'height':170
    }
    >>> student
    {'name': 'jack', 'age': 18, 'height': 170}
    # 查看属性
    >>> student['name']
    'jack'
    # 添加属性
    >>> student['score']=89.0
    >>> student
    {'name': 'jack', 'age': 18, 'height': 170, 'score': 89.0}
    # 删除属性
    >>> del student['height']
    >>> student
    {'name': 'jack', 'age': 18, 'score': 89.0}
    

    0x01 tuple

    tuple也可以表示一个对象,相对于dict来说,它是不可变的,一旦创建就不能随意修改。tuple也只能通过下标来访问对象的属性,因此当属性比较多时使用起来没有dict方便。

    # 对象属性为name、age、height
    >>> student=('jack',18,170.0)
    >>> student
    ('jack', 18, 170.0)
    >>> student[1]
    18
    # tuple不能修改
    >>> student[2]=175.0
    TypeError: 'tuple' object does not support item assignment
    

    0x02 collections.namedtuple

    顾名思义namedtuple就是命名元组。它是tuple数据类型的扩展,同样地一旦创建,它的元素也是不可变的。与普通元组相比命名元组可以通过“属性名”来访问元素。

    >>> from collections import namedtuple
    >>> Point = namedtuple('Point','x,y,z')
    >>> p = Point(1,3,5)
    >>> p
    Point(x=1, y=3, z=5)
    >>> Point = namedtuple('Point','x y z')
    >>> p = Point(1,3,5)
    >>> p
    Point(x=1, y=3, z=5)
    >>> p.x
    1
    >>> p.y = 3.5
    AttributeError: can't set attribute
    # 可以看出通过namedtuple定义对象,就是一个class类型的
    >>> type(p)
    <class '__main__.Point'>
    

    对于一个简单的对象,我们使用namedtuple很方便的来定义,它比定义一个普通class要有更好的空间性能。

    0x03 type.NamedTuple

    Python3.6中新增了type.NamedTuple类,它与collections.namedtuple的操作是类似的。不过,要定义NamedTuple就稍微不一样了。

    >>> from typing import NamedTuple
    # 定义Car类,继承于NamedTuple,并定义属性color、speed、autmatic
    >>> class Car(NamedTuple):
        color:str
        speed:float
        automatic:bool
    
        
    >>> car = Car('red',120.0,True)
    >>> car
    Car(color='red', speed=120.0, automatic=True)
    >>> type(car)
    <class '__main__.Car'>
    # tuple都是不可变的
    >>> car.speed = 130.0
    AttributeError: can't set attribute
    

    0x04 types.SimpleNamespace

    使用SimpleNamespace也可以很方便的定义对象。它的定义等价于

    class SimpleNamespace:
        def __init__(self, **kwargs):
            self.__dict__.update(kwargs)
    
        def __repr__(self):
            keys = sorted(self.__dict__)
            items = ("{}={!r}".format(k, self.__dict__[k]) for k in keys)
            return "{}({})".format(type(self).__name__, ", ".join(items))
    
        def __eq__(self, other):
            return self.__dict__ == other.__dict__
    

    例如定义一个Car对象

    >>> car = SimpleNamespace(color='blue',speed=150.5,automatic=True)
    >>> car
    namespace(automatic=True, color='blue', speed=150.5)
    >>> car.color
    'blue'
    >>> car.speed = 120
    >>> car
    namespace(automatic=True, color='blue', speed=120)
    # 动态添加属性
    >>> car.shift = 23
    >>> car
    namespace(automatic=True, color='blue', shift=23, speed=120)
    # 删除属性
    >>> del car.shift
    >>> car
    namespace(automatic=True, color='blue', speed=120)
    

    0x05 struct.Struct

    这是一个结构体对象,可以把C语言中的struct序列化成Python对象。例如处理文件中的二进制数据或从网络中请求的数据,可以使用这个struct.Struct来表示。

    使用struct好处是数据格式是预先定义好的,可以对数据进行打包成二进制数据,空间效率会好很多。

    # 定义一个struct,'1sif'表示数据的格式,1s一个字符长度,i表示整数,f表示浮点数
    >>> Student=Struct('1sif')
    # 使用pack方法打包数据,存储性别、年龄、身高
    >>> stu = Student.pack(b'm',18,175.0)
    >>> stu
    b'm\x00\x00\x00\x12\x00\x00\x00\x00\x00/C'
    # unpack方法解包
    >>> Student.unpack(stu)
    (b'm', 18, 175.0)
    

    0x06 class

    class当然是定义一个对象的标准方式了。在Python定义类也非常简单,除了可以定义属性还可以定义方法。

    >>> class Student:
        def __init__(self,name,age,height):
            self.name = name
            self.age = age
            self.height = height
        
        def printAge(self):
            print(self.age)
    
            
    >>> stu = Student('jack',18,175.0)
    # 如果想让定义的对象输出属性信息可以重写__repr__方法
    >>> stu
    <__main__.Student object at 0x10afcd9b0>
    >>> stu.name
    'jack'
    >>> stu.age = 19
    

    0x07 总结一下

    本文盘点Python中定义对象各种的方法,除了class,还有有dicttuplenamedtupleNamedTupleSimpleNamespaceStruct
    如果一个对象属性不多可以使用tuple;
    如果一个对象属性不可变可以考虑使用namedtupleNamedTuple
    如果一个对象要转成JSON进行传输可以使用dict;
    如果考虑比较空间性能,可以使用Struct

    0x08 学习资料

    • Python Tricks: A Buffet of Awesome Python Features
      ——Dan Bader

    相关文章

      网友评论

          本文标题:如何在Python中表示一个对象

          本文链接:https://www.haomeiwen.com/subject/hcavsctx.html