This is a similar question but my goal is not performance but readability.
Let's say I have different Behaviours, and they share a repeated function 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()
I want f1() to have access to instance attributes and local variables inside run() without passing them as arguments.
Probably I can implement that inside Behavior but I don't have access to 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()
Is there any pythonic or OOP way of writting a C-Style macro for f1()?
Behavior?f1()to have access to objects and data inside run() without passing them as arguments." - why? Just instance attributes, or other local variables? Could you provide a less abstract example that demonstrates what you're actually trying to achieve?f1(),f2(), ... are steps of a simulation. Data is partitioned and distributed using mpi and the methodrun()is implemented differently for eachBehaviorclass. Finally steps f1(), f2(), ... need to access local variables produced byrun()