调用子方法时如何强制执行强制性父方法调用?

混乱

我想要执行的是强制执行以下操作:当子类从父类继承并且它重写父方法而不显式调用它时,将引发错误。错误可以在不良类的初始化时或在调用方法时引发。

目的是确保Mother类的用户执行了mother方法中存在的某些操作。

例子

class Mother():
    def necessary_method(self):
         # do some necessary stuff

class GoodChild(Mother):
    def necessary_method(self):
        # necessary parent call
        super().necessary_method()

class BadChild(Mother):
    def necessary_method(self):
         # no parent call
         return

致电时:

good = GoodChild()
# works fine
bad = BadChild()
# exception could be raised here

good.necessary_method()
# works fine
bad.necessary_method()
# exception could be raised here

这真的有可能吗?欢迎任何答案或解决方法。

马可斯

是的,至少在运行时绝对有可能。U可以创建一个Metaclass修改类创建方式的,其思想是necessary_method通过添加mother_method_called仅在Mother调用版本时才为真的标志来更改签名,否则将引发Value Error例如在python3

class MotherMetaClass(type):
    def __new__(cls, name, bases, attrs):
        method_name = 'necessary_method'
        mother_class_name = 'Mother'
        original_necessary_method = attrs.get(method_name)

        def necessary_method_validated(*args, **kwargs):
            original_necessary_method(*args, **kwargs)

            if name == mother_class_name:
                cls.mother_method_called = True
            else:
                if not cls.mother_method_called:
                    raise ValueError(f'Must call "super()" when overriding "{method_name}".')
                cls.mother_method_called = False

        attrs[method_name] = necessary_method_validated

        return super().__new__(cls, name, bases, attrs)


class Mother(metaclass=MotherMetaClass):
    def necessary_method(self):
        print('Parent method called.')


class GoodChild(Mother):
    def necessary_method(self):
        super().necessary_method()
        print('Good child method called.')


class BadChild(Mother):
    def necessary_method(self):
        print("Bad child method called.")


a = GoodChild()
a.necessary_method()  # it's going to work properly


b = BadChild()
b.necessary_method()  # it's going to raise Value Error

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

对非构造方法强制执行超级调用

来自分类Dev

在C ++中的编译时强制执行函数调用

来自分类Dev

Ember组件生命周期挂钩方法-调用super是强制性的吗?

来自分类Dev

强制执行类调用序列要求

来自分类Dev

强制子类在重写时调用父方法

来自分类Dev

如何从抽象类强制执行方法?

来自分类Dev

使用注释强制执行方法

来自分类Dev

Python:强制执行抽象方法

来自分类Dev

强制调用专用方法

来自分类Dev

如何在每次调用connect时强制执行GoogleApiClient来提示帐户选择器UI?

来自分类Dev

打字稿-如何强制调用类方法?(使方法强制)

来自分类Dev

尝试调用方法时强制关闭

来自分类Dev

如何强制python指向子甚至父调用?

来自分类Dev

实体框架6-强制执行异步查询,编译时阻止同步调用

来自分类Dev

我可以在编译时强制执行永远不会调用该函数吗?

来自分类Dev

Ajax 调用从 PHP 强制执行新的 SessionID

来自分类Dev

如何从子级强制调用基本方法

来自分类Dev

如何使用堆栈强制调用 componentWillMount 方法?

来自分类Dev

SQL Server:如何在事务结束时强制执行完整性?

来自分类Dev

使类变量初始化为强制性的最佳方法

来自分类Dev

在Haxe中,当未在“抽象”超类中定义子类时,如何在子类中强制执行方法声明?

来自分类Dev

用Java强制执行周期性边界条件的最快方法

来自分类Dev

用Java强制执行周期性边界条件的最快方法

来自分类Dev

强制调用基类方法

来自分类Dev

OOP,强制方法调用顺序

来自分类Dev

强制调用基类方法

来自分类Dev

如何强制我的类的任何子类始终调用父类的重写的实现方法?

来自分类Dev

从父调用子方法,当从子调用父方法时

来自分类Dev

运行简单的Hive查询时如何强制执行MR?

Related 相关文章

  1. 1

    对非构造方法强制执行超级调用

  2. 2

    在C ++中的编译时强制执行函数调用

  3. 3

    Ember组件生命周期挂钩方法-调用super是强制性的吗?

  4. 4

    强制执行类调用序列要求

  5. 5

    强制子类在重写时调用父方法

  6. 6

    如何从抽象类强制执行方法?

  7. 7

    使用注释强制执行方法

  8. 8

    Python:强制执行抽象方法

  9. 9

    强制调用专用方法

  10. 10

    如何在每次调用connect时强制执行GoogleApiClient来提示帐户选择器UI?

  11. 11

    打字稿-如何强制调用类方法?(使方法强制)

  12. 12

    尝试调用方法时强制关闭

  13. 13

    如何强制python指向子甚至父调用?

  14. 14

    实体框架6-强制执行异步查询,编译时阻止同步调用

  15. 15

    我可以在编译时强制执行永远不会调用该函数吗?

  16. 16

    Ajax 调用从 PHP 强制执行新的 SessionID

  17. 17

    如何从子级强制调用基本方法

  18. 18

    如何使用堆栈强制调用 componentWillMount 方法?

  19. 19

    SQL Server:如何在事务结束时强制执行完整性?

  20. 20

    使类变量初始化为强制性的最佳方法

  21. 21

    在Haxe中,当未在“抽象”超类中定义子类时,如何在子类中强制执行方法声明?

  22. 22

    用Java强制执行周期性边界条件的最快方法

  23. 23

    用Java强制执行周期性边界条件的最快方法

  24. 24

    强制调用基类方法

  25. 25

    OOP,强制方法调用顺序

  26. 26

    强制调用基类方法

  27. 27

    如何强制我的类的任何子类始终调用父类的重写的实现方法?

  28. 28

    从父调用子方法,当从子调用父方法时

  29. 29

    运行简单的Hive查询时如何强制执行MR?

热门标签

归档