Python 如何获取类的名称';a';其中类';b';创造了什么?
我想做和Django一样的事。如果我有一个Model Poll和一个Model Choices,并定义了一个属性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.
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。