gpt4 book ai didi

python - 禁止向 Python 子类添加新方法

转载 作者:行者123 更新时间:2023-12-03 21:57:19 28 4
gpt4 key购买 nike

我有两个类应该为两个独立的库(让我们称它们为 LibA 和 LibB)实现相同的测试用例。到目前为止,我定义了要在抽象基类中实现的测试方法,以确保两个测试类都实现所有所需的测试:

from abc import ABC, abstractmethod

class MyTests(ABC):
@abstractmethod
def test_foo(self):
pass

class TestsA(MyTests):
def test_foo(self):
pass

class TestsB(MyTests):
def test_foo(self):
pass

这按预期工作,但仍然可能发生的是,在 LibB 上工作的人不小心添加了 test_bar()方法 TestB而不是基类。失踪的 test_bar()TestA在这种情况下,类将被忽视。

有没有办法禁止向(抽象)基类添加新方法?目标是强制在基类中添加新方法,从而强制在所有派生类中实现新方法。

最佳答案

是的。它可以通过元类完成,或者从 Python 3.6 开始,检查 __init_subclass__基类的。
__init_sublass__是每次实例化子类时由语言调用的特殊方法。因此,它可以检查新类是否具有任何父类(super class)中不存在的任何方法,并在声明子类时引发 TypeError。 ( __init_subclass__ 自动转换为类方法)

class Base(ABC):
...
def __init_subclass__(cls, *args, **kw):
super().__init_subclass__(*args, **kw)
# By inspecting `cls.__dict__` we pick all methods declared directly on the class
for name, attr in cls.__dict__.items():
attr = getattr(cls, name)
if not callable(attr):
continue
for superclass in cls.__mro__[1:]:
if name in dir(superclass):
break
else:
# method not found in superclasses:
raise TypeError(f"Method {name} defined in {cls.__name__} does not exist in superclasses")



请注意,与未实现的抽象方法引发的 TypeError 不同,此错误是在类声明时引发的,而不是类实例化时。如果需要后者,则必须使用元类并将检查移至其 __call__方法 - 然而,这使事情复杂化,就好像在中间类中创建了一个方法,该方法从未被实例化,当该方法在叶子类中可用时,它不会引发。我想你需要的更多是上面的代码。

关于python - 禁止向 Python 子类添加新方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61328355/

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