Вы можете использовать (оскорбления?) искажение личного имени для достижения этого эффекта.Если вы посмотрите на атрибут self
, который начинается с __
внутри метода, python изменит имя с __attribute
на _classThisMethodWasDefinedIn__attribute
.
Просто каким-то образом спрятать нужное имя класса в искаженной форме, чтобы метод мог его увидеть.Например, мы можем определить метод __new__
для базового класса, который делает это:
def mangle(cls, attrname):
if not attrname.startswith('__'):
raise ValueError('attrname must start with __')
return '_%s%s' % (cls.__name__, attrname)
class A(object):
def __new__(cls, *args, **kwargs):
obj = object.__new__(cls)
for c in cls.mro():
setattr(obj, mangle(c, '__defn_classname'), c.__name__)
return obj
def __init__(self):
pass
def test(self):
print self.__defn_classname
class B(A):
def __init__(self):
A.__init__(self)
a = A()
b = B()
a.test()
b.test()
, который печатает:
A
A