猿问

Python中类似C的结构

有没有一种方法可以在Python中方便地定义类似C的结构?我讨厌写这样的东西:


class MyStruct():

    def __init__(self, field1, field2, field3):

        self.field1 = field1

        self.field2 = field2

        self.field3 = field3


米脂
浏览 616回答 3
3回答

翻翻过去那场雪

使用命名的tuple,它已添加到Python 2.6的标准库的collections模块中。如果您需要支持Python 2.4,也可以使用Raymond Hettinger的命名元组配方。这对于您的基本示例很好,但是也涵盖了以后可能会遇到的许多极端情况。您上面的片段将写为:from collections import namedtupleMyStruct = namedtuple("MyStruct", "field1 field2 field3")新创建的类型可以这样使用:m = MyStruct("foo", "bar", "baz")您还可以使用命名参数:m = MyStruct(field1="foo", field2="bar", field3="baz")

青春有我

更新:数据类通过引入数据类中的Python 3.7,我们非常接近。下面的示例类似于下面的NamedTuple示例,但是结果对象是可变的,并且允许使用默认值。from dataclasses import dataclass@dataclassclass Point:    x: float    y: float    z: float = 0.0p = 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 NamedTupleclass User(NamedTuple):    name: strclass MyStruct(NamedTuple):    foo: str    bar: int    baz: list    qux: Usermy_item = MyStruct('foo', 0, ['baz'], User('peter'))print(my_item) # MyStruct(foo='foo', bar=0, baz=['baz'], qux=User(name='peter'))
随时随地看视频慕课网APP

相关分类

Python
我要回答