Как включить макросы в Python?
Это похожий вопрос, но моя цель-не производительность, а читаемость.
Предположим, у меня есть разные
Behaviours, и они разделяют повторяющуюся функцию 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()
Существует ли какой-либо питонский или ООП способ написания макроса в стиле C для f1()?
2 ответов:
Макросы не являются неотъемлемой конструкцией в python, так как в нем нет препроцессора, подобного C++.
Таким образом, все, что вы делаете, чтобы позволить вам написать код только один раз, должно быть сделано...
Вне python (то есть вы вручную используете препроцессор gcc); или
С помощью отладочной информации в Python (т. е. разделить стек вызова)
Бывший-это боль в заднице, но это выполнимо.
Последнее тоже боль в приклад, но тоже выполнимо.
Однако, поскольку ваша цель-повысить читабельность, ни один из этих вариантов не хорош, потому что любой, кто привык к python, не будет иметь абсолютно никакого представления о том, что вы делаете. Будьте очень осторожны при переносе языковых конструкций из других языков в python.
Если ваша функция нуждается в модификации локальных переменных, то вам придется писать одни и те же строки кода в каждом месте.
Если вам просто нужно их использовать, я настоятельно рекомендую просто передайте аргументы - или переосмыслите свой дизайн и потребность во многих производных классах, которые делают примерно одно и то же в одной функции (например, что если вы разбили эту "функцию" на несколько частей функции и позволили производным классам переопределить только те, которые они хотят?).
То, что вы на самом деле хотите, звучит как "доступ к внешним переменным области", которые не являются глобальными.
Если вы используете python3.x, вы должны найти нелокальное ключевое слово .
Если вы используете python2.x, попробуйте использовать изменяемый объект в качестве оболочки для вашего объекта.
На самом деле мой ответ основан на этом.
Comments