Python 如何获取类的名称';a';其中类';b';创造了什么?

Python 如何获取类的名称';a';其中类';b';创造了什么?,python,django,class,object,Python,Django,Class,Object,我想做和Django一样的事。如果我有一个Model Poll和一个Model Choices,并定义了一个属性Poll=ForeignKey(Poll)Poll有一个名为Poll.Choices\u set 我必须输入以下代码: class rel(object): def __init__(self,cls): # here I want to get the name of class c there this class is instanced.

我想做和Django一样的事。如果我有一个Model Poll和一个Model Choices,并定义了一个属性
Poll=ForeignKey(Poll)
Poll有一个名为
Poll.Choices\u set

我必须输入以下代码:

class rel(object):
    def __init__(self,cls):
        # here I want to get the name of class c there this class is instanced.
        setattr(cls,[name_of_class_c] +"_set",cls())

class a(object):
    pass

class c(object):
    somevar = 3
    relationField = rel(a);

abc = a();
print abc.c_set.somevar
这里
class a
是class Poll,
class c
是Choices类,
class rel
是外键类


有人知道如何实现这一点吗?

如果您只想设置一个属性,可以将类本身作为参数传递:

class rel(object):
    def __init__(self,cls, parent):
        setattr(cls,parent.__name__ +"_set",cls())
class c(object):
    somevar = 3
    relationField = rel(a, c);
或者,如果您只想知道名称:

class rel(object):
    def __init__(self,cls, name):
        setattr(cls,name+"_set",cls())
class c(object):
    somevar = 3
    relationField = rel(a, 'c');

找到了一个肮脏的解决方法,但还不完美:

class Model:
    pass
class rel(object):
    def __init__(self,cls):
    self.relation = cls;

class a(Model):
    pass

class c(Model):
    some_other = 4
    a = rel(a)

class b(Model):
    somevar = 3
    a = rel(a);

### Some sort of hack ###
gl = list(globals())
for v in gl:
    if type(eval(v)).__name__ == 'classobj':
        cls = eval(v);
        if len(cls.__bases__) > 0 and cls.__bases__[0].__name__ == "Model":
            for atr in dir(cls):
                if type(getattr(cls,atr)).__name__ == "rel":
                    relL = getattr(cls,atr).relation;
                    print relL.__name__, "->", cls.__name__
                    setattr(relL,cls.__name__ + "_set",cls)
### End - Some sort of hack ###

d = a();
print a.b_set.somevar
print a.c_set.some_other
输出:

a -> c
a -> b
3
4
a Relations:
a <- c
a <- b
c Relations:
c <- d
...
编辑:一些更好的肮脏黑客:

class Model:
    ### Some sort of hack ###
    def __init__(self):
        gl = list(globals())
        print self.__class__.__name__, "Relations:"
            for v in gl:
                if type(eval(v)).__name__ == 'classobj':
                    cls = eval(v)
                    if len(cls.__bases__) > 0 and cls.__bases__[0].__name__ == "Model":
                        for atr in dir(cls):
                            if type(getattr(cls,atr)).__name__ == "rel":
                                rell = getattr(cls,atr).relation;
                                if isinstance(self,rell):
                                    print rell.__name__, "<-", cls.__name__
                                    setattr(rell,cls.__name__ + "_set",cls)
    ### End - Some sort of hack ###

class rel(object):
    def __init__(self,cls):
    self.relation = cls;

class a(Model):
    pass

class c(Model):
    some_other = 1
    a = rel(a);

class d(Model):
    string = "Hello"
    c = rel(c)
class b(Model):
    somevar = 3
    a = rel(a);
    d = rel(d);


a = a();
c = c();
print "\nVars:"
print "somevar",":",a.b_set.somevar
print "some_other",":",a.c_set.some_other
类模型:
###某种黑客###
定义初始化(自):
gl=列表(globals())
打印自我。类别。名称。关系:
对于gl中的v:
如果类型(eval(v))。\uuuuuu name\uuuuuu=='classobj':
cls=评估值(v)
如果len(cls.\uuuuu bases)>0且cls.\uuuuu bases.\uuuuu[0]。\uuuuuu name.\uuuuuu==“Model”:
对于目录中的atr(cls):
如果类型为(getattr(cls,atr))。\uuuuu name\uuuuuu==“rel”:
rell=getattr(cls,atr)关系;
如果存在(自身、相对):

打印版本名称,“请更新答案。。。这看起来像一个绕口令我不知道问题出在哪里。这是一个叫做元编程的黑魔法。见此:Django在内部使用它。我建议你不要走那条路,除非你真的不得不走。维护这样的代码很困难。如果你不确定自己是否需要它,那么你就不需要它了但是你知道我怎样才能做到吗?这是一个小例子,但我想用django的方法来做,因为django不需要将类c传递给rel。