了解slot如何使用dictionary类

2024-09-28 20:53:05 发布

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

最近有人给我指出了__slots__的用法,我在互联网上发现它可以提高内存使用率

class Passenger2():
    __slots__ = ['first_name', 'last_name']
    def __init__(self, iterable=(), **kwargs):
        for key, value in kwargs:
            setattr(self, key, value)

class Passenger():
    def __init__(self, iterable=(), **kwargs):
        self.__dict__.update(iterable, **kwargs)

# NO SLOTS MAGIC works as intended
p = Passenger({'first_name' : 'abc', 'last_name' : 'def'})
print(p.first_name)
print(p.last_name)

# SLOTS MAGIC
p2 = Passenger2({'first_name' : 'abc', 'last_name' : 'def'})
print(p2.first_name)
print(p2.last_name)

当第一个类按预期工作时,第二个类将给我一个属性错误。__slots__的正确用法是什么

Traceback (most recent call last):
  File "C:/Users/Educontract/AppData/Local/Programs/Python/Python36-32/tester.py", line 10, in <module>
    print(p.first_name)
AttributeError: first_name

Tags: keynameself用法initdefiterablekwargs
1条回答
网友
1楼 · 发布于 2024-09-28 20:53:05

解压缩您提供的关键字参数:

p2 = Passenger2(**{'first_name' : 'abc', 'last_name' : 'def'})

并遍历kwargs.items()以获取键值对。你知道吗

在您执行的呼叫中:

p2 = Passenger2({'first_name' : 'abc', 'last_name' : 'def'})

您提供的字典被分配给iterable,而不是kwargs,因为您将它作为位置传递。**kwargs在本例中为空,不执行赋值。你知道吗

记住,**kwargs获取过多的关键字参数,而不仅仅是传递的任何字典。你知道吗

相关问题 更多 >