在Python中表示一个对象的方法
在 Python中一切都是对象。如果要在 Python中表示一个对象,除了定义 class外还有哪些方式呢?我们今天就来盘点一下。
0x00dict
字典或映射存储 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} #删除属性 >>>delstudent['height'] >>>student {'name':'jack','age':18,'score':89.0}
0x01tuple
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'objectdoesnotsupportitemassignment
0x02collections.namedtuple
顾名思义 namedtuple就是命名元组。它是 tuple数据类型的扩展,同样地一旦创建,它的元素也是不可变的。与普通元组相比命名元组可以通过“属性名”来访问元素。
>>>fromcollectionsimportnamedtuple >>>Point=namedtuple('Point','x,y,z') >>>p=Point(1,3,5) >>>p Point(x=1,y=3,z=5) >>>Point=namedtuple('Point','xyz') >>>p=Point(1,3,5) >>>p Point(x=1,y=3,z=5) >>>p.x 1 >>>p.y=3.5 AttributeError:can'tsetattribute #可以看出通过namedtuple定义对象,就是一个class类型的 >>>type(p)
对于一个简单的对象,我们使用 namedtuple很方便的来定义,它比定义一个普通 class要有更好的空间性能。
0x03type.NamedTuple
Python3.6中新增了 type.NamedTuple类,它与 collections.namedtuple的操作是类似的。不过,要定义 NamedTuple就稍微不一样了。
>>>fromtypingimportNamedTuple #定义Car类,继承于NamedTuple,并定义属性color、speed、autmatic >>>classCar(NamedTuple): color:str speed:float automatic:bool >>>car=Car('red',120.0,True) >>>car Car(color='red',speed=120.0,automatic=True) >>>type(car)#tuple都是不可变的 >>>car.speed=130.0 AttributeError:can'tsetattribute
0x04types.SimpleNamespace
使用 SimpleNamespace也可以很方便的定义对象。它的定义等价于
classSimpleNamespace: def__init__(self,**kwargs): self.__dict__.update(kwargs) def__repr__(self): keys=sorted(self.__dict__) items=("{}={!r}".format(k,self.__dict__[k])forkinkeys) return"{}({})".format(type(self).__name__,",".join(items)) def__eq__(self,other): returnself.__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) #删除属性 >>>delcar.shift >>>car namespace(automatic=True,color='blue',speed=120)
0x05struct.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)
0x06class
class当然是定义一个对象的标准方式了。在 Python定义类也非常简单,除了可以定义属性还可以定义方法。
>>>classStudent: def__init__(self,name,age,height): self.name=name self.age=age self.height=height defprintAge(self): print(self.age) >>>stu=Student('jack',18,175.0) #如果想让定义的对象输出属性信息可以重写__repr__方法 >>>stu <__main__.Studentobjectat0x10afcd9b0> >>>stu.name 'jack' >>>stu.age=19
0x07总结一下
本文盘点 Python中定义对象各种的方法,除了 class,还有有 dict、 tuple、 namedtuple、 NamedTuple、 SimpleNamespace和 Struct。
如果一个对象属性不多可以使用 tuple;
如果一个对象属性不可变可以考虑使用 namedtuple或 NamedTuple;
如果一个对象要转成 JSON进行传输可以使用 dict;
如果考虑比较空间性能,可以使用 Struct。
总结
以上所述是小编给大家介绍的在Python中表示一个对象的方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。