2009-04-09 26 views
1

如何使用包含类名的字符串来引用类本身?
看到这个(没有工作)为例...Python:从字符串引用类?

class WrapperClass: 
    def display_var(self): 
     #FIXME: self.__class_name__.__name__ is a string 
     print self.__class__.__name__.the_var 

class SomeSubClass(WrapperClass): 
    var = "abc" 

class AnotherSubClass(WrapperClass): 
    var = "def" 

而且一个明显的错误消息:

 
>>> b = SomeSubClass() 
>>> b.display_var() 
Traceback (most recent call last): 
    File "", line 1, in 
    File "", line 4, in display_var 
AttributeError: 'str' object has no attribute 'the_var' 
>>> 

谢谢!

回答

5

?如何使用字符串包含一个类名来引用类本身

类是不是特别的,他们只是值包含在变量如果你说:

class X(object): pass 

在全局范围内,那么变量'X'将是对类对象的引用。

你可以得到当前脚本/模块的全局变量使用“全局()”字典,所以:

classobj= globals()[self.__class__.__name__] 
print classobj.var 

locals()也可用于局部变量,不把他们之间应该永远需要。使用可怕eval()访问变量)

但是大卫指出,self.__class__已经classobj,所以没有必要去运行有关的名字从全局变量取它; self.__class__.var很好。虽然真的:

print self.var 

将是通常的简单方法来做到这一点。只要实例没有用别的东西覆盖名字,类成员就可以作为它们实例的成员。

1

如果你打电话给print self.__class__.var,你的例子就可以工作。我不认为有必要使用这个名字。

+0

哈哈,有道理!非常感谢。 – Orphee 2009-04-09 16:37:34

+0

显然不是,他为什么会问他是否知道答案? – 2009-04-09 16:48:03

2

取决于你在哪里得到这个字符串,任何一般的方法可能是不安全的(一个这样的方法是简单地使用eval(string)最好的方法是定义一个字典映射名称类:

class WrapperClass: 
    def display_var(self): 
     #FIXME: self.__class_name__.__name__ is a string 
     print d[self.__class__.__name__].the_var 

class SomeSubClass(WrapperClass): 
    the_var = "abc" 

class AnotherSubClass(WrapperClass): 
    the_var = "def" 

d = {'WrapperClass': WrapperClass, 'SomeSubClass': SomeSubClass, 'AnotherSubClass': AnotherSubClass} 
AnotherSubClass().display_var() 
# prints 'def'