为了账号安全,请及时绑定邮箱和手机立即绑定

Python中类似C的结构

Python中类似C的结构

米脂 2019-12-07 14:18:56
有没有一种方法可以在Python中方便地定义类似C的结构?我讨厌写这样的东西:class MyStruct():    def __init__(self, field1, field2, field3):        self.field1 = field1        self.field2 = field2        self.field3 = field3
查看完整描述

3 回答

?
翻翻过去那场雪

TA贡献2065条经验 获得超14个赞

使用命名的tuple,它已添加到Python 2.6的标准库的collections模块中。如果您需要支持Python 2.4,也可以使用Raymond Hettinger的命名元组配方。


这对于您的基本示例很好,但是也涵盖了以后可能会遇到的许多极端情况。您上面的片段将写为:


from collections import namedtuple

MyStruct = namedtuple("MyStruct", "field1 field2 field3")

新创建的类型可以这样使用:


m = MyStruct("foo", "bar", "baz")

您还可以使用命名参数:


m = MyStruct(field1="foo", field2="bar", field3="baz")


查看完整回答
反对 回复 2019-12-07
?
青春有我

TA贡献1784条经验 获得超8个赞

更新:数据类

通过引入数据类中的Python 3.7,我们非常接近。


下面的示例类似于下面的NamedTuple示例,但是结果对象是可变的,并且允许使用默认值。


from dataclasses import dataclass


@dataclass

class Point:

    x: float

    y: float

    z: float = 0.0


p = Point(1.5, 2.5)


print(p)  # Point(x=1.5, y=2.5, z=0.0)

如果您想使用更多特定的类型注释,那么这与新的键入模块配合使用非常好。


我一直在拼命等待!如果您问我,数据类和新的NamedTuple声明,再加上键入模块,真是天赐之物!


改进了NamedTuple声明

从Python 3.6开始,只要您可以忍受不变性,它就变得非常简单和美观(IMHO)。


引入了一种声明NamedTuples的新方法,该方法还允许类型注释:


from typing import NamedTuple


class User(NamedTuple):

    name: str


class MyStruct(NamedTuple):

    foo: str

    bar: int

    baz: list

    qux: User


my_item = MyStruct('foo', 0, ['baz'], User('peter'))


print(my_item) # MyStruct(foo='foo', bar=0, baz=['baz'], qux=User(name='peter'))


查看完整回答
反对 回复 2019-12-07
  • 3 回答
  • 0 关注
  • 614 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号