【Python】定义类代替多层次的字典数据,@property和@属性.setter的使用

文章讲述了在Python中,如何将复杂的多层次字典数据结构转换为面向对象的类结构,通过定义`@property`和`@setter`来管理和访问类的私有属性。示例展示了如何创建`Order`和`Parts`类,以更清晰地表示生产订单和部件清单,同时强调了`@property`用于只读属性,而`@setter`允许读写属性。

【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装饰后的调用方式
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值