Python中的数据类型是否类似于C++中的结构?

Auf*_*ind 24 c++ python struct types

Python中的数据类型是否类似于C++中的结构?我喜欢struct功能myStruct.someName.我知道类有这个,但我不想每次为某些数据需要一个"容器"时编写一个类.

Thi*_*ter 33

为什么不?课程很好.

如果要保存一些内存,可能还需要使用,__slots__因此对象没有__dict__.有关__slots__的详细信息和用法,请参阅http://docs.python.org/reference/datamodel.html#slots 一些有用的信息.

例如,只包含两个值(ab)的类可能如下所示:

class AB(object):
    __slots__ = ('a', 'b')
Run Code Online (Sandbox Code Playgroud)

如果你真的想要一个dict但是有obj.item访问而不是obj['item'],你可以继承dict和实现,__getattr____setattr__表现得像__getitem____setitem__.


soc*_*ock 14

除了dict类型之外,还有一个namedtuple类型,其行为有点像struct.

MyStruct = namedtuple('MyStruct', ['someName', 'anotherName'])
aStruct = MyStruct('aValue', 'anotherValue')

print aStruct.someName, aStruct.anotherName
Run Code Online (Sandbox Code Playgroud)

  • 请注意,`namedtuple`是只读的,即你不能改变像`aStruct.someName ="foo"`这样的值(当然这与普通元组一致). (2认同)

Cha*_*imG 8

dataclass 从Python 3.7开始,它现在内置于Python!

from dataclasses import dataclass

@dataclass
class EZClass:
    name: str='default'
    qty: int
Run Code Online (Sandbox Code Playgroud)

测试:

classy = EZClass('cars', 3)
print(classy)
Run Code Online (Sandbox Code Playgroud)

输出:

EZClass(name='cars', qty=3)
Run Code Online (Sandbox Code Playgroud)

除了自动初始化和__repr__它生成的方法之外,它还自动创建一种__eq__方法,使比较两个类的实例变得简单直观.

PEP 557.

使用dataclasses包反向移植到Python 3.6 .


Ant*_*lov 6

请注意,在C++中,类和结构之间的唯一区别是类的元素默认是私有的,继承也是如此.以下是等效的:

class D : public B {
    public:
    ...
}; 

struct D {
    ...
};
Run Code Online (Sandbox Code Playgroud)

在Python中,如果要使用点运算符来访问元素,则最有意义的是使用类.事实上,它更容易,因为您只需初始化您当前想要的成员,并可以在以后添加/删除成员.因此,以下方法可行:

class D(object):
    pass
Run Code Online (Sandbox Code Playgroud)

然后,您可以根据需要添加任意数量的成员,只需指定它们即可.


whe*_*ies 5

您始终可以采用动态方法:

class foo(object):
    def __init__(self,**kwargs):
        self.__dict__.update(kwargs)
Run Code Online (Sandbox Code Playgroud)

这将创建一个具有与您作为字典传入的相同方法的类:

bar = foo(bill="yo",heather="hi",sam="piss off")
Run Code Online (Sandbox Code Playgroud)

给您留下以下完全有效的电话bar

bar.bill
>> "yo"
bar.heater
>> "hi"
Run Code Online (Sandbox Code Playgroud)

你明白了...