Может ли Python определить класс объекта, обращающегося к методу

Есть ли в любом случае сделать что-то вроде этого:

class A:
    def foo(self):
        if isinstance(caller, B):
           print "B can't call methods in A"
        else:
           print "Foobar"
class B:
    def foo(self, ref): ref.foo()

class C:
    def foo(self, ref): ref.foo()


a = A();
B().foo(a)    # Outputs "B can't call methods in A"
C().foo(a)    # Outputs "Foobar"

кудагость вA использует некоторую форму самоанализа для определения класса вызывающего методаобъект?

РЕДАКТИРОВАТЬ:

В конце я соединил это, основываясь на некоторых предложениях:

import inspect
...
def check_caller(self, klass):
    frame = inspect.currentframe()
    current = lambda : frame.f_locals.get('self')
    while not current() is None:
        if isinstance(current(), klass): return True
        frame = frame.f_back
    return False

Это'не идеально подходит для всех причин, но спасибо за ответы: они были большой помощью.

Ответы на вопрос(3)

Ваш ответ на вопрос