python - 如何在Python中包含宏?

标签 python oop design-patterns

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/

相关文章:

oop - 知道何时对领域关系进行建模以及如何处理上下文关系

python - 同一个对象的不同内存地址

java - 从静态方法返回多个值的最佳数据结构

multithreading - 我的 “design pattern”用于异步方法好吗?

design-patterns - 什么是用于 "Process as Message"工作队列的 Erlang 设计模式?

python - Django、Google App Engine 和 Postgres 可以协同工作吗?

python - 如何让 Discord 机器人显示 "Bot is typing ..."状态?

python - 用于 python 类型提示检查的控制台工具

javascript - 作为事件观察者的类

python - Redis 或 Memcached 是否可以用于 "lock"资源,例如 S3 之类的 blobstore?