在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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。