Y at-il de toute façon de faire quelque chose comme ceci:Peut-Python déterminer la classe d'un objet qui accède à une méthode
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"
Où appelant en A
utilise une forme d'introspection pour déterminer la classe de l'objet de la méthode d'appel ?
EDIT:
En fin de compte, je mis cela ensemble en fonction de quelques-unes des suggestions:
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
Ce n'est pas parfait pour toutes les raisons fournies, mais merci pour les réponses: ils étaient une grande aide.
Vous mentionnez que vous avez des tas de classes qui s'appellent l'une l'autre. Vous semblez essayer d'insérer une sorte de "sécurité" où vous restreignez quelles classes sont autorisées à faire quoi. C'est en général une mauvaise idée. S'il vous plaît expliquer pourquoi vous voulez faire cela, et peut-être que quelqu'un peut trouver une meilleure solution à l'usecase. –
ur le faire rong – Triptych