python笔记:dataclass

1 引子:其他类似实现方法的局限性

假设我们现在需要实现这样的内容:

nameChina
area960
population140967

1.1 tuple/list

country1_tuple=('China','960','140967')
country1_tuple[0]
#'China'

缺点:需要记住各个属性是list/tuple第几位的属性(基于位置)

1.2 字典

country1_dict={'name':'China',
              'area':960,
              'population':140967}
country1_dict['name']
#'China'
  • 不足
    • 不能用country1_dict.name的形式进行控制
    • 少值【country1_dict={'name':'China', 'area':960】一样可以创建成功

1.3 namedtuple

python 库整理: collections.namedtuple_python collections.namedtuple创建一个-CSDN博客

from collections import namedtuple

Country=namedtuple('Country1',['name','area','population'])

country1=Country('China',960,'140967')
country2=Country('Singapore',733,564)

country1
#Country1(name='China', area=960, population='140967')

country2.name
#'Singapore'
  • 弥补了字典的两个缺点
    • 可以用country2.name的形式
    • 少值会报错
  • 不足
    • 无法修改值

1.4 自定义类

class Country:
    def __init__(self,name,area,population):
        self.name=name
        self.area=area
        self.population=population
        
country1_class=Country('China',960,140967)
country1_class.name
#'China'


country1_class.name="PRC"
  • 解决了namedtuple无法修改值的问题
  • 不足:
    • __init__方法中重复代码 (示例中每个属性都需要写3遍)

2 数据类dataclass

  • 提供了一个简写__init__方法的语法糖. 
  • 类型注释是必填项
  • 默认值的传递方式和__init__方法的参数格式一致
from dataclasses import dataclass

@dataclass
class Country_dc:
    name:str
    area:int
    population:int=40
        
country_dc1=Country_dc('China',960,140967)
country_dc2=Country_dc('Singapore',733)


country_dc1
#Country_dc(name='China', area=960, population=140967)


country_dc2
#Country_dc(name='Singapore', area=733, population=40)

2.1 数据嵌套

from typing import List

@dataclass
class Countrys_dc:
    name:str
    countries:List[Country_dc]
country_lst=Countrys_dc('China & SG',[country_dc1,country_dc2])
country_lst
'''
Countrys_dc(name='China & SG', countries=[Country_dc(name='China', area=960, population=140967), Country_dc(name='Singapore', area=733, population=40)])
'''

2.2 数据类不可变

 要使数据类不可变,需要在创建类时设置frozen=True。

参考内容:Python中的数据类dataclass详解_python dataclass-CSDN博客

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
当出现`TypeError: 'int' object is not iterable`错误时,意味着你尝试对一个整数进行迭代操作,而整数是不可迭代的。 解决这个问题的方法是,在进行迭代操作时,需要使用`range`函数来生成一个整数序列,然后对序列进行迭代。例如,使用`for`循环时,需要将整数作为参数传递给`range`函数,然后在`for`循环中对生成的序列进行迭代操作。 另外,需要注意的是,`reverse`方法会直接修改原列表,而不会返回一个新的反转后的列表。所以在例子中,应该将`n1.reverse()`修改为`n1[::-1]`来获取反转后的列表。 以下是对这个问题的解决方法: ```python n = input("请输入一个五位数") n1 = list(n) n2 = n1[::-1] # 反转列表 for i in range(len(n1)): if n1[i] == n2[i]: print("是回文数") else: print("不是回文数") ``` 这样就能正确地判断一个五位数是否为回文数了。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Python开发时报TypeError ‘int‘ object is not iterable解决方式](https://blog.csdn.net/Bejpse/article/details/125241151)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [《Python数据分析基础》笔记:“TypeError, ‘int’ object is not iterable”](https://download.csdn.net/download/weixin_38658086/14910832)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [python出现‘int‘ object is not iterable的解决办法](https://blog.csdn.net/VIA_12/article/details/126333672)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

UQI-LIUWJ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值