如何发现类重新定义?

这是一个非常简单的设置:


class A(object):

    x = 1


class B(object):

    x = 2


class C(object):

    x = 3


class B(B):

    x = 4


class C(object):

    x = 5


print A.x, B.x, C.x

输出预期:


1, 4, 5

是否有可能检测到 B 已被“重新定义”但 C 已被“替换”?是在创建阶段还是随后通过检查对象?


这些类被用作配置对象,上面有一个加载器类,它导入模块,然后自省以找到类及其属性,然后应用程序将它们用于实例命名参数。例如


class tcp_port(number):

    minimum = 1024

    maximum = 2048

实际上,python 只是用作一种方便的脚本语言来定义主应用程序中的参数。这些文件可供最危险的人编辑: 客户 因此,要求能够在运行时检测类是否(意外地)重用了已定义的名称,但要安全地通过偶尔的情况其中一个类被重新定义,然后调整或添加一些属性:


class tcp_port(tcp_port):

    maximum = 4096

所以......我希望有一些运行时健全性检查程序,而不是类似 lint 的解决方案。此外,这需要在定义类而不是实例化时发生。


...是否有全局函数被调用来创建一个类(或任何其他对象)?有点像有__new__但在全球范围内?


斯蒂芬大帝
浏览 207回答 2
2回答

手掌心

如果该类是就地重新定义的,它将在 MRO 中保留其自身的旧版本:>>> [x for x in A.mro() if x.__name__ == A.__name__][__main__.A]>>> [x for x in B.mro() if x.__name__ == B.__name__][__main__.B, __main__.B]>>> [x for x in C.mro() if x.__name__ == C.__name__][__main__.C]所以你可以检测到这种情况:def has_redefinition_inplace(classobj):    types = [x for x in classobj.mro() if x.__name__ == classobj.__name__]    return len(types) > 1这不会是 100% 可靠的,因为可能存在从不同模块进入 MRO 的合法冲突类名称。

大话西游666

一个好的 linter 会警告没有使用的重新声明。一个好的 IDE 会直接在编辑器中 lint。例如,PyCharm 将使用警告颜色突出显示这些类名:发现这些问题的另一个好方法是在您的测试套件中使用覆盖率。名称被覆盖的函数(常见的复制粘贴错误)在函数体中不能有测试覆盖。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python