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()?
 
     
     
    