【Python】定义类代替多层次的字典数据,@property和@属性.setter的使用
重温历史,发现一个深度字典定义的思维转换方式,供有需要的人(我我我!)温故知新
实际开发中,随着需求逐渐变的复杂,凭借本能定义的字典层次会越来越深,例如:某公司新制定生产订单,按照列表思路定义如下:
orders_list = [
{
"name": "拖拉机01",
"num": "001",
"client": "XX有限公司",
"parts_list":{
"cab": 1,
"carriage": 1,
"engine": 1
}
},
{
"name": "拖拉机01",
"num": "002",
"client": "XX集团",
"parts_list":{
"cab": 22,
"carriage": 22,
"engine": 22
}
}
]
将其转换成面向对象的思路,把每个订单拆分成订单order和部件清单两个类
class Order(object):
"""整机类,存放订单整机信息"""
def __init__(self, name, num, client, parts):
self._name = name # 设置私有属性
self._num = num
self._client = client
self._parts = parts
@property
def name(self):
return self._name
@name.setter
def name(self, new_name):
self._name = new_name
@property
def num(self):
return self._num
@num.setter
def num(self, new_num):
self._num = new_num
@property
def client(self):
return self._client
@client.setter
def client(self, new_client):
self._client = new_client
@property
def parts(self):
return self._parts
@parts.setter
def parts(self, new_parts):
self._parts = new_parts
@property
def show_info(self):
print("司机室数量为:", self._parts.cab)
class Parts(object):
"""零部件类,存放每个零部件的名称和数量"""
def __init__(self, cab, carriage, engine):
self._cab = cab
self._carriage = carriage
self._engine = engine
@property
def cab(self):
return self._cab
@cab.setter
def cab(self, new_cab):
self._cab = new_cab
@property
def carriage(self):
return self._carriage
@carriage.setter
def carriage(self, new_carriage):
self._carriage = new_carriage
@property
def engine(self):
return self._engine
@engine.setter
def engine(self, new_engine):
self._engine = new_engine
# 实例化时,先实例化零部件类,然后存放在整机订单中
company1_parts = Parts(1,1,1)
company1_order = Order("拖拉机", "001", "XX有限公司", company1_parts)
print(company1_order.name)
company1_order.name = "翻斗机"
print(company1_order.name)
company1_order.show_info
关于@property和@属性名.setter的用法和区别:
@property当类中的属性为私有属性时,外部不可以直接修改,使用@property和@属性名.setter配合读取和修改属性,
@property表示只读,@属性名.setter表示可读可写
@property
def cab(self):
return self._cab
@cab.setter
def cab(self, new_cab):
self._cab = new_cab
当类方法的上方添加@property,可以以调用属性的方式来调用该方法。
调用方法:
o1 = ClassName()
o1.show() # 普通调用类方法
o1.show # 使用@property装饰后的调用方式
文章讲述了在Python中,如何将复杂的多层次字典数据结构转换为面向对象的类结构,通过定义`@property`和`@setter`来管理和访问类的私有属性。示例展示了如何创建`Order`和`Parts`类,以更清晰地表示生产订单和部件清单,同时强调了`@property`用于只读属性,而`@setter`允许读写属性。
600

被折叠的 条评论
为什么被折叠?



