如何使用“下一行”而不是“超级”

2024-05-16 21:03:55 发布

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

这是一个“怎么做”的问题,而不是“我应该吗?”在合理的程度上,我确实理解这种替代的局限性。你知道吗

在他关于Super considered super!的精彩演讲中,雷蒙德·赫廷格提到,他认为“超级”是“超级”的一个坏名字,我们应该更多地把它看作“下一个”。 和其他许多人一样,我也觉得这是有道理的。你知道吗

因此,在我自己的代码中,我在想,如果我想在任何时候调用“下一行”,而不是使用super,是否可以使用不同的名称/句柄。 我正在考虑使用句柄:“下一行中的下一个\u”,因为它是替换的直观名称!你知道吗

我理解在任何其他导入的包中使用此名称时可能发生的潜在冲突。但我在Python的探索/学习期间并不关心这一点。你知道吗

所以,我的问题是:我应该如何在一个中心位置实现这一目标?你知道吗

以雷蒙德的相关blog post为例

class LoggingDict(dict):
    def __setitem__(self, key, value):
        print(f'Setting key {key} to {value}')
        super().__setitem__(key, value)

我希望能够做到这一点:

class LoggingDict(dict):
    def __setitem__(self, key, value):
        print(f'Setting key {key} to {value}')
        next_in_line().__setitem__(key, value)

编辑1:

虽然我希望在一个地方而不是在每个模块中执行此操作,但即使以下操作也会导致错误:

next_in_line = super

class LoggingDict(dict):
    def __setitem__(self, key, value):
        print(f'Setting key {key} to {value}')
        next_in_line().__setitem__(key, value)

ld = LoggingDict()
ld[1] = 'a'

输出:

Setting key 1 to a
Traceback (most recent call last):
  File "D:/pyth/logging_dict.py", line 9, in <module>
    ld[1] = 'a'
  File "D:/pyth/logging_dict.py", line 6, in __setitem__
    next_in_line().__setitem__(key, value)
RuntimeError: super(): __class__ cell not found

Tags: tokeyinself名称valuedefline
1条回答
网友
1楼 · 发布于 2024-05-16 21:03:55

警告:不要这样做!关键字super是Python语言的一部分。如果你不喜欢,那就改用这种语言,试着说服其他程序员也跟着你。否则,除了您之外的所有人(甚至您自己)都无法理解您的代码。你知道吗

现在你被警告了。。。您可以使用super的显式形式:

next_in_line = super

class LoggingDict(dict):
    def __setitem__(self, key, value):
        print(f'Setting key {key} to {value}')
        next_in_line(LoggingDict, self).__setitem__(key, value)

或者可以在装饰器中破解函数的__globals__属性:

def next_in_line(func):
    def inner(self, *args, **kwargs):
        def nel(t=type(self), o=self):
            return super(t, o)
        func.__globals__["next_in_line"] = nel
        func(self, *args, **kwargs)

    return inner


class LoggingDict(dict):
    @next_in_line
    def __setitem__(self, key, value):
        print(f'Setting key {key} to {value}')
        next_in_line().__setitem__(key, value)

不过,别那么做。你知道吗

相关问题 更多 >