如何在Python中包含宏?
这是一个类似的问题,但我的目标不是性能,而是可读性 假设我有不同的如何在Python中包含宏?,python,oop,design-patterns,Python,Oop,Design Patterns,这是一个类似的问题,但我的目标不是性能,而是可读性 假设我有不同的行为,它们共享一个重复的函数f1() 我希望f1()能够访问run()中的实例属性和局部变量,而无需将它们作为参数传递 也许我可以在行为中实现,但我没有访问localVar的权限 from abc import ABCMeta, abstractmethod class Behavior: __metaclass__ = ABCMeta @abstractmethod def run(self):
行为
,它们共享一个重复的函数f1()
我希望f1()
能够访问run()
中的实例属性和局部变量,而无需将它们作为参数传递
也许我可以在行为
中实现,但我没有访问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()
是否有任何一种用于C代码风格宏的代码,用于<代码> f1()> />代码>
宏不是Python中的固有结构,因为没有C++中使用的预处理器。 因此,任何允许您只编写一次代码的操作都必须完成- python之外(即手动使用gcc的预处理器);或
- 通过使用python中的调试信息(即解构调用堆栈)
如果它只是需要使用它们,我强烈建议只传递参数——或者重新考虑您的设计和对许多派生类的需求,这些派生类在一个函数中执行大致相同的操作(即,如果您将该“函数”分解为函数的多个部分,让派生类只覆盖它们想要的部分,该怎么办?).您真正想要的听起来像是“访问外部范围变量”,而不是全局的 如果您使用python3.x,您应该查找 如果使用python2.x,请尝试使用可变对象作为对象的包装器
实际上,我的答案是基于一个。为什么不在抽象类
Behavior
中定义它?“我希望f1()
能够访问run()中的对象和数据,而不将它们作为参数传递。”-为什么?只是实例属性,还是其他局部变量?你能提供一个不那么抽象的例子来说明你真正想要达到的目标吗?我花了很长时间才明白你的意思。我建议明确指出,您希望f1()是一个C风格的宏,而不是一个函数。@iAdjunct不确定,实际上是f1()
,f2()
。。。是模拟的步骤。使用mpi对数据进行分区和分发,并且方法run()
对每个行为
类的实现方式不同。最后是步骤f1(),f2()。。。需要访问由run()
No生成的局部变量,我的意思是编辑您的帖子并明确指出您希望该函数是一个宏。当然,也就是说,假设这就是你真正的意思。
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()