python具名形式

当函数参数个数较多,按照python规范,需要使用class/nametuple/dataclass等具名形式进行封装
1.使用class,__init__不受参数个数的限制

class People():
    def __init__(self, name, age, sex, height, weight):
        self.name = name
        self.age = age
        self.sex = sex
        self.height = height
        self.weight = weight

    def func(self):
        pass


if __name__ == '__main__':
    p = People("Tom", 12, "male", 167, 45)

2.使用具名元组nametuple
格式如下:

collections.namedtuple(typename, field_names, verbose=False, rename=False) 

参数说明:
typename:元组名称
namedtuple 返回一个元组的子类(即具名元组类),类名为 typename。
通过具名元组类创建出来的具名元组对象,其内部元素支持属性查找(点号语法)、索引操作(方括号语法),并且是可迭代的。
具名元组对象还有自动生成的文档字符串,和一个 __repr__ 方法,把具名元组对象展示为 name=value 的格式。
field_names:具名元组的字段名
它可以通过两种形式指定:
1.字符串组成的序列
比如 [‘x’, ‘y’]、(‘x’, ‘y’)
2.一个长字符串,各个字段名之间用空格或逗号分隔
比如 ‘x y’ 或者 ‘x, y’
字段名必须符合以下规则:
以字母开头
由字母、数字、下划线组成
不能与关键字重名
不能以下划线开头
3.rename 默认为 False,它是只能以关键字形式指定的参数,或者叫做强制关键字参数
如果 rename=True,那么无效的字段名会被替换为 ‘_索引值’。
比如 collections.namedtuple('User', 'name age id name import', rename=True)会被转换成 User(name='tester', age='22', id='464643123', _3=12, _4=324)。其中与关键字重名的 ‘def’ 和重复的 ‘abc’ 都被替换成了 ‘_索引值’,因此:如果元素名称中含有 python 的关键字,则必须设置为 rename=True,如果设置为False则会报错ValueError
4.verbose 默认

import collections

User = collections.namedtuple('User', 'name age id name import', rename=True)
user = User('tester', '22', '46', 12, 324)
# 属性访问
print(user.name, user.age)
print(repr(user))
# 索引访问
print(user[1], user[2])

输出为:

tester 22
User(name='tester', age='22', id='46', _3=12, _4=324)
22 46

具名元组的特有属性:
类属性 _fields:获取这个类所有字段名
类方法 _make(iterable):从序列或者可迭代对象实例化一个具名元组
实例方法 _asdict():返回一个 OrderedDict 有序字典对象,把字段名映射到相应的值,对应repr的key-value对

import collections

User = collections.namedtuple('User', 'name age id name import', rename=True)
user = User('tester', '22', '46', 12, 324)

print(repr(user))
# 返回一个 OrderedDict 有序字典对象,把字段名映射到相应的值,对应repr的key-value对
print(user._asdict())
# 获取这个类所有字段名
print(user._fields)
# 从序列或者可迭代对象实例化一个具名元组
user2 = User._make(['test1', 'test2', 1, 2, 3])
print(repr(user2))

输出为:

User(name='tester', age='22', id='46', _3=12, _4=324)
{'name': 'tester', 'age': '22', 'id': '46', '_3': 12, '_4': 324}
('name', 'age', 'id', '_3', '_4')
User(name='test1', age='test2', id=1, _3=2, _4=3)

3.dataclass

from dataclasses import dataclass


@dataclass
class People:
    name: str
    age: int
    sex: str
    height: int
    weight: int


def func(op):
    print(op.name, op.age)


if __name__ == '__main__':
    people1 = People("Bob", 12, "male", 123, 56)
    func(people1)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值