【问题标题】:Is there a way to ignore part of __init__() method while super() in Python3?有没有办法在 Python3 中的 super() 时忽略 __init__() 方法的一部分?
【发布时间】:2021-03-08 21:42:47
【问题描述】:

我正在考虑是否有一种方法可以在 Python3 中使用带有 super() 的继承但忽略部分方法?我可以在下面向您展示一个示例。

假设我有初始化一些 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

我想继承这个类及其 init() 方法,但我想将GPIO.setmode(GPIO.BCM) 更改为GPIO.setmode(GPIO.BOARD)。有没有办法在不将整个 __init__ 复制到我的子类中的情况下做到这一点?

在这一行中更改并复制它并不是什么大问题,但我很好奇是否可以避免复制粘贴;)

【问题讨论】:

  • 你能更改编码器代码吗?这将是添加具有默认值的参数甚至创建对可继承方法的调用以进行特化的好时机。
  • 不,没有。您可以将该代码分解为两个单独的函数并在 __init__ 中调用它

标签: python python-3.x inheritance raspberry-pi


【解决方案1】:

正如@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)

【讨论】:

  • 是的,我知道在这种情况下它很容易,我只是这样做了,但是我之前在使用其他一些更复杂的库时遇到了类似的问题,然后我无法编辑源代码,只需要稍作改动就可以复制整个方法。这就是为什么我要问是否有其他方法:D 如果没有,没关系。感谢您的意见!
【解决方案2】:

我找到了另一个选项,但它不是很好。在 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()

【讨论】:

    猜你喜欢
    • 2015-09-16
    • 1970-01-01
    • 1970-01-01
    • 2015-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-27
    • 2020-07-02
    相关资源
    最近更新 更多