2009-04-09 2 views
1

Как использовать строку, содержащую имя класса, для ссылки на сам класс?
Смотрите это (не работает) Exemple ...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 

будет обычным простым способом сделать это. Члены класса доступны как члены их экземпляров, если экземпляр не перезаписывает имя чем-то другим.

+0

+1 красиво объяснено –

+0

hmmm: «переменная« X »будет ссылкой« Не совсем ». Идентификатор «X» является объектом класса и может использоваться везде, где будет использоваться константа. –

+0

Действительно. То, что я пытаюсь описать в неуклюжем английском, состоит в том, что, хотя X - объект класса, это действительно просто ссылка; если вы присвоили что-то еще «X», то этого больше не будет. Важным моментом является то, что в Python имя «X» не становится особенным; это просто другая переменная. – bobince

1

Ваш пример будет работать, если вы позвонили print self.__class__.var. Я не думаю, что есть необходимость использовать это имя.

+0

Ха-ха, имеет смысл! Большое спасибо. – Orphee

+0

По-видимому, нет, почему он спросил, знает ли он ответ? –

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' 
Смежные вопросы