This是一个类似的问题,但我的目标不是性能而是可读性。
假设我有不同的行为
,并且它们共享一个重复的函数f1()
。
from abc import ABCMeta, abstractmethod
class Behavior:
__metaclass__ = ABCMeta
@abstractmethod
def run(self):
pass
class Behavior1(Behavior):
def __init__(self, data):
self.data = data
def run(self):
def f1():
print(self.data*localVar)
localVar = 1.
f1()
class Behavior2(Behavior):
def __init__(self, data):
self.data = data
def run(self):
def f1():
print(self.data*localVar)
localVar = 2.
f1()
class Behavior3(Behavior):
def __init__(self, data):
self.data = data
def run(self):
def f1():
print(self.data*localVar)
localVar = 3
f1()
我希望 f1()
能够访问 run()
内的实例属性和局部变量,而不将它们作为参数传递。
也许我可以在 Behavior
中实现它,但我无权访问 localVar
。
from abc import ABCMeta, abstractmethod
class Behavior:
__metaclass__ = ABCMeta
@abstractmethod
def run(self):
pass
def f(self):
print(self.data*localVar)
class Behavior1(Behavior):
def __init__(self, data):
self.data = data
def run(self):
def f1():
print(self.data*localVar)
localVar = 1.
f1()
self.f()
class Behavior2(Behavior):
def __init__(self, data):
self.data = data
def run(self):
def f1():
print(self.data*localVar)
localVar = 2.
f1()
self.f()
class Behavior3(Behavior):
def __init__(self, data):
self.data = data
def run(self):
def f1():
print(self.data*localVar)
localVar = 3
f1()
self.f()
是否有任何 Pythonic 或 OOP 方法可以为 f1()
编写 C 风格宏?
最佳答案
宏不是 Python 中的固有结构,因为没有像 C++ 那样的预处理器可供使用。
因此,您必须做任何让您只编写一次代码的事情......
Python 之外(即您手动使用 gcc 的预处理器);或
通过在 python 中使用调试信息(即解构调用堆栈)
前者虽然令人头疼,但也是可行的。
后者也很麻烦,但也是可行的。
但是,由于您的目标是提高可读性,因此这两个选项都不好,因为任何习惯使用 python 的人都绝对不知道您在做什么。将语言结构从其他语言移植到 python 时要非常小心。
如果您的函数需要修改局部变量,那么您必须在每个地方编写相同的代码行。
如果它只需要使用它们,我强烈建议只传递参数 - 或者重新考虑你的设计和对许多派生类的需求,它们都在一个函数中做大致相同的事情(即,如果你将该“函数”分成几个部分怎么办?函数并让派生类仅重写它们想要的函数?)。
关于python - 如何在Python中包含宏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31518781/