Python 如何在调用子方法时强制父方法调用?

Python 如何在调用子方法时强制父方法调用?,python,inheritance,methods,overriding,Python,Inheritance,Methods,Overriding,我想要强制执行的是,当一个子类从父类继承,并且它重写父方法而不显式调用它时,会引发一个错误。 在初始化坏类或调用方法时可能会引发错误 目标是确保母类的用户执行母方法中存在的某些操作 范例 class Mother(): def necessary_method(self): # do some necessary stuff class GoodChild(Mother): def necessary_method(self): # neces

我想要强制执行的是,当一个子类从父类继承,并且它重写父方法而不显式调用它时,会引发一个错误。 在初始化坏类或调用方法时可能会引发错误

目标是确保母类的用户执行母方法中存在的某些操作

范例

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
这真的有可能吗?
欢迎使用任何答案或解决方法。

是的,这绝对是可能的,至少在运行时是可能的。你可以创建一个修改类创建方式的
元类
,其思想是通过添加一个名为的
mother\U方法
标志来更改
required\U方法
签名,该标志只有在调用
mother
版本时才会为真,否则它将引发一个
值错误
。例如在
python3
中:

类母元类(类型):
定义(cls、名称、基数、属性):
方法\u名称='必要的\u方法'
母亲\班级\姓名=‘母亲’
原始方法=attrs.get(方法名称)
定义必要的方法验证(*args,**kwargs):
原始必要方法(*args,**kwargs)
如果名称==母类名称:
cls.mother_方法_调用=True
其他:
如果没有调用cls.mother\u方法:
raise VALUERROR(f'在重写“{method_name}”时必须调用“super()”)
cls.mother_方法_调用=False
attrs[方法\u名称]=必要的\u方法\u已验证
return super()。\uuuuu new\uuuuuu(cls、name、base、attrs)
类母(元类=母元类):
def必要的_方法(自身):
print('调用父方法')
班级好孩子(母亲):
def必要的_方法(自身):
super().必要的_方法()
print('调用了好的子方法')
班上的孩子(母亲):
def必要的_方法(自身):
打印(“调用了错误的子方法”)
a=好孩子()
a、 必要的方法()它会正常工作的
b=坏孩子()
b、 必要的_方法()#它将引起值错误

答案不错,但有一个小问题,即包装器没有保留返回值。很容易修复。对,只需将其存储在变量中并在末尾返回即可。