gpt4 book ai didi

python - 如何在使用 __slots__ 时访问 __getattr__

转载 作者:行者123 更新时间:2023-11-28 21:42:34 25 4
gpt4 key购买 nike

在应用 __slots__ 之前,我可以这样做:

class C(object):

def __init__(self):
self.m_A = 1

def __getattr__(self, name):
if name in ("A"):
return self.__dict__["m_%s" % name]
raise AttributeError(name)

a = C()
a.A

现在,我想使用__slots__;但是,这会禁用 __dict__ 导致我的代码中断。

所以,我的问题是:

  1. 还有其他方法吗?(除了property)

  2. Python 如何在使用 __slots__ 时访问对象属性?

最佳答案

只是改变:

return self.__dict__["m_%s" % name]

到:

return getattr(self, "m_%s" % name)

前者使用不适用的实现细节,后者根据名称明确查找新属性。

注意:对于这种特定情况,我会完全避免 __getattr__,因为它会涉及太多开销,而只是执行以下操作:

@property
def A(self):
return self.m_A

这将表现相同,并且运行速度更快(通过 __getattr__getattr 调用的一般调度比通过属性描述符的目标查找更昂贵)。如果你有十几个这样的插槽来制作只读访问器,你仍然可以通过在创建类之后添加访问器来相当便宜地使用这个模式:

from operator import attrgetter

class Foo(object):
__slots__ = 'm_XXX', 'm_YYY', etc.

... rest of class body ...

# Add readonly accessors sans m_ prefix for each slot with an m_ prefix:
for membername in Foo.__slots__:
if membername.startswith('m_'):
setattr(Foo, membername.replace('m_', '', 1), property(attrgetter(membername)))

关于python - 如何在使用 __slots__ 时访问 __getattr__,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43508930/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com