有没有办法在 Python3 中的 super() 时忽略 __init__() 方法的一部分?

Is there a way to ignore part of __init__() method while super() in Python3?

我正在考虑是否可以在 Python3 中使用 inherit with super() 但忽略了部分方法?我可以在下面给你看一个例子。

假设我有 class 初始化一些 RPi GPIO

class Encoder(object):
    def __init__(self, A, B):
        GPIO.setmode(GPIO.BCM)
        GPIO.setup(A, GPIO.IN)
        GPIO.setup(B, GPIO.IN)
        self.A = A
        self.B = B

我想继承这个class和它的init()方法,但是我想把GPIO.setmode(GPIO.BCM)改成GPIO.setmode(GPIO.BOARD) .有没有办法不用将整个 __init__ 复制到我的 child class?

在这一行中更改并复制它没什么大不了的,但是我很好奇是否可以避免copy-pasting ;)

正如@tdalaney 所说,如果您可以编辑编码器源代码,您可以:

class Encoder(object):
    def __init__(self, A, B, kwarg=GPIO.BCM):
        GPIO.setmode(kwarg)
        GPIO.setup(A, GPIO.IN)
        GPIO.setup(B, GPIO.IN)
        self.A = A
        self.B = B

然后在子类中

class subclass:
    def __init__(self, A,, B, ...):
        super().__init__(A, B, kwarg=GPIO.BOARD)

我找到了另一个选项,但效果并不理想。在 python 中,您可以使用 inspect 模块来读取函数源代码。使用这个你可以编辑它以满足你的需要。这假定您知道要更改哪一行。您可以按如下方式进行:

import inspect

class A:
    def __init__(self):
        self.var1 = 1
        self.var2 = 2
        self.var3 = 3

class B(A):
    def __init__(self):
        code = inspect.getsource(A.__init__).split("\n")[1:]
        code = deTab(code)
        code[1] = "self.var2 = 10"
        code = rebuild(code)
        exec(code)

def deTab(code):
    count = 0
    for space in code[0]:
        if space != " ":
            break
        count+=1
    return [line[count:] for line in code]

def rebuild(code):
    return "".join([line+"\n" for line in code])

a = A()
b = B()