我有一个像这样的python代码。
名为mymodule.py的文件
class MyBase(object):
pass
名为data.py的文件
from mymodule import MyBase
class A:
class NestA(MyBase):
pass
class NestB(MyBase):
pass
class B:
class NestA(MyBase):
pass
class NestB(MyBase):
pass
如果我有一个= A.NestA(不是它指的是一个类,一个不是NestA类的对象,而是类本身),我如何找出它所属的嵌套类层次结构? a。名称给了我NestA,这不是问题。我想找出NestA所属的外部类,即A类或B类。我该怎么做?
答案 0 :(得分:1)
您可以使用inspect模块执行此操作:
import inspect
a = A.NestA
print a in [x[1] for x in inspect.getmembers(A, inspect.isclass)]
print a in [x[1] for x in inspect.getmembers(B, inspect.isclass)]
结果:
True
False
<强>附录:强>
如果您对模块中的类一无所知,可以回溯并获取模块。
# for each class in a's module...
for klass in inspect.getmembers(inspect.getmodule(a), inspect.isclass):
# see if a is in that class
if a in [x[1] for x in inspect.getmembers(klass[1], inspect.isclass)]:
print a, "is a member of", klass[0]
结果:
__main__.NestA is a member of A
答案 1 :(得分:0)
你可以用元类编程做这样的事情。
class SetOuterClassType(type):
def __init__(cls, name, bases, attrs):
for attrname, attrvalue in attrs.iteritems():
if getattr(attrvalue, '__set_outerclass__', False):
attrvalue.__outerclass__ = cls
class OuterClassSetter(object):
__metaclass__ = SetOuterClassType
class MyBase(object):
@classmethod
def fullname(cls):
if hasattr(cls,'__outerclass__'):
return '%s.%s' % (
cls.__outerclass__.__name__, cls.__name__ )
else:
return '%s' % cls.__name__
class A(OuterClassSetter):
class NestA(MyBase):
__set_outerclass__ = True
class NestB(MyBase):
__set_outerclass__ = True
class B(OuterClassSetter):
class NestA(MyBase):
__set_outerclass__ = True
class NestB(MyBase):
__set_outerclass__ = True
print A.NestA.fullname() # prints 'A.NestA'
print A.NestB.fullname() # prints 'A.NestB'
print B.NestA.fullname() # prints 'B.NestA'
print B.NestB.fullname() # prints 'B.NestB'
答案 2 :(得分:0)
你要求的是糟糕设计的结果。我建议你重新定义你的解决方案。