有没有办法在 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()
我正在考虑是否可以在 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()