Python中的类C结构

2024-04-15 23:58:08 发布

您现在位置:Python中文网/ 问答频道 /正文

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

class MyStruct():
    def __init__(self, field1, field2, field3):
        self.field1 = field1
        self.field2 = field2
        self.field3 = field3

Tags: 方法self定义initdef结构classfield2
3条回答

使用named tuple,它被添加到Python 2.6标准库中的collections module。如果需要支持Python2.4,也可以使用Raymond Hettinger的named tuple配方。

这对您的基本示例很好,但也涵盖了一些以后可能会遇到的边缘情况。上面的片段将被写成:

from collections import namedtuple
MyStruct = namedtuple("MyStruct", "field1 field2 field3")

新创建的类型可以如下使用:

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

也可以使用命名参数:

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

你可以使用元组来处理很多在C语言中使用结构的事情(例如x、y坐标或RGB颜色)。

对于其他一切,您可以使用dictionary或类似于this one的实用程序类:

>>> class Bunch:
...     def __init__(self, **kwds):
...         self.__dict__.update(kwds)
...
>>> mystruct = Bunch(field1=value1, field2=value2)

我认为“确定的”讨论是here,在Python食谱的发布版本中。

更新:数据类

随着Python 3.7中Data Classes的引入,我们已经非常接近了。

下面的示例类似于下面的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)

如果您想使用更具体的类型注释,那么这可以很好地与新的typing模块配合使用。

我一直在等这个!如果你问我,数据类和新的NamedTuple声明,再加上输入模块是天赐良机!

改进的NamedTuple声明

因为Python3.6它变得非常简单和漂亮(IMHO),只要您能够忍受不变性。

引入了new way of declaring NamedTuples,它还允许type annotations

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'))

相关问题 更多 >