2013-12-08 45 views
0

我想要做的和Django一样。如果我有一个模型投票和模式选择和定义属性Poll = ForeignKey(Poll)投票有一个名为场Poll.choices_set如何获得创建类“b”的类“a”的名称?

我有下面的代码:

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 c选项类别class rel外键类别

有人知道如何做到这一点吗?

+0

请更新的答案......这看起来像一个拗口令 – Goin

+0

我不知道问题是什么。 – Sebi2020

+0

这是一个叫做元编程*的黑魔法。看到这个:http://python-3-patterns-idioms-test.readthedocs.org/en/latest/Metaprogramming.html Django在内部使用它。我建议不要走这条路,除非你真的**必须。维护这样的代码很困难。如果你不确定你是否需要它,那么你不需要它。 :) – freakish

回答

0

如果你只需要设置一个属性,你可以通过类本身作为参数:

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'); 
+0

但我想这样做Django做到这一点,因为与Django在哪里是不需要传递类C到rel。 – Sebi2020

0

发现了一个脏解决方法,不是很完美:

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 

编辑:更好一些肮脏的黑客:

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 

输出:

a Relations: 
a <- c 
a <- b 
c Relations: 
c <- d 
... 
相关问题