Thi*_*ter 33
为什么不?课程很好.
如果要保存一些内存,可能还需要使用,__slots__因此对象没有__dict__.有关__slots__的详细信息和用法,请参阅http://docs.python.org/reference/datamodel.html#slots ?一些有用的信息.
例如,只包含两个值(a和b)的类可能如下所示:
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)
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 .
请注意,在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)
然后,您可以根据需要添加任意数量的成员,只需指定它们即可.
您始终可以采用动态方法:
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)
你明白了...