如何在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中的调试信息(即解构调用堆栈)

前者是一种痛苦,但却是可行的

后者也是一种痛苦,但也是可行的

然而,由于您的目标是提高可读性,这两个选项都不好,因为任何习惯python的人都完全不知道您在做什么。在将其他语言的语言结构移植到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()