python - 访问子类中覆盖方法的签名
问题描述
在 python3.8.5 中,我正在使用一个superCl
定义了方法的现有类f
,以及多个现有的子类sub1
, ......用不同数量的变量sub2
覆盖。f
基于如何通过向多个类添加相同的方法来创建新的子类,我想g
通过超类向所有子类添加一个新函数。新函数应该调用f
它并用它做事。问题是每个子类都有不同的签名f
。我怎样才能解决这个问题?示例代码如下:
import numpy as np
class superCl(object): # Exists already
def f(self, x): return x
class sub1(superCl): # Exists already
def f(self, x, a, b): return x / (b - a)
class sub2(superCl): # Exists already
def f(self, x, tau): return 1/tau * np.exp(-x/tau)
sc = superCl()
print(sc.f(0))
s1 = sub1()
print(s1.f(0, 1, 2))
s2 = sub2()
print(s2.f(0, 1))
def g(self, x1, x2, ...): # New, calls existing method. Is there some way to get the signatures and values from the subclasses, eg self.args?
print('Extra meth')
self.f(x1, ...) - self.f(x2, ...) # How to adapt to proper arguments for f for each sublcass?
superCl.g = g # New method gets added to new and existing instances
print(sc.g(0, 1))
print(s1.g(0, 1, 1, 2))
print(s2.g(0, 1, 1))
编辑:超类定义了一组通用函数;子类是特殊情况,每个都有不同的变量。函数f
返回子类参数的函数值;g
我正在尝试创建的函数评估f
两个不同点的差异。
解决方案
看起来像使用*args
或**kwds
这样做(位置参数与关键字参数):
import numpy as np
class superCl(object): # Exists already
def f(self, x): return x
class sub1(superCl): # Exists already
def f(self, x, a, b): return x / (b - a)
class sub2(superCl): # Exists already
def f(self, x, tau): return 1/tau * np.exp(-x/tau)
sc = superCl()
print(sc.f(0))
s1 = sub1()
print(s1.f(0, 1, 2))
s2 = sub2()
print(s2.f(0, 1))
print('===========================================')
def g(self, x1, x2, *args):
print("args", *args)
return self.f(x2, *args) - self.f(x1, *args)
superCl.g = g
print("--------------------\n"); print("sc", sc.f(1), '-', sc.f(0), "=", sc.g(0, 1))
print("--------------------\n"); print("s1", s1.f(1, 0, 4), '-', s1.f(0, 0, 4), "=", s1.g(0, 1, 0, 4))
print("--------------------\n"); print("s2", s2.f(1, 5), '-', s2.f(0, 5), "=", s2.g(0, 1, 5))
print('===========================================')
def h(self, x1, x2, **args):
print("args", args)
return self.f(x2, **args) - self.f(x1, **args)
superCl.h = h
print("--------------------\n"); print("sc", sc.f(1), '-', sc.f(0), "=", sc.h(0, 1))
print("--------------------\n"); print("s1", s1.h(0, 1, a=0, b=4))
print("--------------------\n"); print("s2", s2.h(0, 1, tau=5))
推荐阅读
- java - SpringBoot 不在实体中保存 Set
- python - 我想在 PyQt5 的 QtableView 中显示一个 csv 文件
- django-rest-framework - 无法使用 Django Rest Framework 更新现有数据?
- javascript - 在将(对象数组)列转换为行数据时进行计算
- aws-lambda - 如何使用 Micronaut Lambda 应用程序原生映像记录 AWSRequestId
- c# - 如何用对象列表过滤对象列表?
- image - IndexError:索引 3 在给出原始图像(彩色图像)时超出轴 0 的范围,大小为 3?
- c++ - 在 GCC 中使用不同标准的情况下失败
- c++ - 如何将鼠标光标限制在窗口内
- javascript - 如何使用 html2canvas 渲染“多层”线性渐变