gpt4 book ai didi

Python:从类内部访问静态类变量

转载 作者:行者123 更新时间:2023-12-01 05:57:55 24 4
gpt4 key购买 nike

因此,我尝试创建一个扩展列表的类,并具有将某些特殊属性映射为引用列表的某些部分的额外功能。使用this Py3k doc page ,我创建了以下代码。这个想法是(假设我有一个此类的 sequence 实例)sequence.seq 的行为应该与 sequence[0] 完全相同,并且 sequence.index 的行为应该与 sequence[2] 等完全相同。

它似乎工作得很好,只是我似乎无法访问将属性映射到列表的类变量。

我找到了this SO question ,但要么答案是错误的,要么方法内部有些不同。我还可以使用 self.__class__.__map__ ,但由于我需要 __getattribute__ 内的类变量,这会让我陷入无限递归循环。

>>> class Sequence(list):
... __map__ = {'seq': 0,
... 'size': 1,
... 'index': 2,
... 'fdbid': 3,
... 'guide': 4,
... 'factors': 5,
... 'clas': 6,
... 'sorttime': 7,
... 'time': 8,
... 'res': 9,
... 'driver': 10 }
...
... def __setattr__(self, name, value): # "Black magic" meta programming to make certain attributes access the list
... print('Setting atr', name, 'with val', value)
... try:
... self[__map__[name]] = value
... except KeyError:
... object.__setattr__(self, name, value)
...
... def __getattribute__(self, name):
... print('Getting atr', name)
... try:
... return self[__map__[name]]
... except KeyError:
... return object.__getattribute__(self, name)
...
... def __init__(self, seq=0, size=0, index=0, fdbid=0, guide=None, factors=None,
... sorttime=None, time=None):
... super().__init__([None for i in range(11)]) # Be sure the list has the necessary length
... self.seq = seq
... self.index = index
... self.size = size
... self.fdbid = fdbid
... self.guide = ''
... self.time = time
... self.sorttime = sorttime
... self.factors = factors
... self.res = ''
... self.driver = ''
...
>>> a = Sequence()
Setting atr seq with val 0
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 31, in __init__
File "<stdin>", line 17, in __setattr__
NameError: global name '__map__' is not defined

最佳答案

由于在完全定义 Sequence 之前不会调用任何方法,因此您可以毫无问题地引用 Sequence.__map__。例如:

def __setattr(self, name, value):
print('Setting atr', name, 'with val', value)
try:
self[Sequence.__map__[name]] = value
except KeyError:
object.__setattr__(self, name, value)
<小时/>

顺便说一句,这里演示了只要同名的实例属性不存在,就可以通过对象访问类属性:

class Foo:
i = 3
def __init__(self, overwrite):
if overwrite:
self.i = 4

f = Foo(False)
id(f.i) == id(Foo.i) # Should be True
f = Foo(True)
id(f.i) == id(Foo.i) # Should be False

关于Python:从类内部访问静态类变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11680656/

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