2016-02-25 5 views
0

В Python 3.5 как присвоить имя класса переменной класса? Очевидной альтернативой является жесткое кодирование имени класса.Назначить имя класса переменной класса в Python

class Foo(object): 
    the_module = __name__ 
    also_the_module = __module__ 

    def name_of_module(self): 
     return __name__ 
    def name_of_class(self): 
     return __class__.__name__ 

print("Foo.the_module=  ", Foo.the_module) 
print("Foo.also_the_module= ", Foo.also_the_module) 
print("Foo.__name__=  ", Foo.__name__) # what is desired but outside of class def 
print("Foo().name_of_module=", Foo().name_of_module()) 
print("Foo().name_of_class= ", Foo().name_of_class()) # what is desired but inside a method 

Я пытался получать класс от первого аргумента @classmethod.

class Foo(object): 
    @classmethod 
    def class_name(cls): 
     return cls.__name__ 

# Both of these produce the correct response but neither 
# can be used assign to a class variable 
print("Foo.class_name()= ", Foo.class_name()) 
print("Foo().class_name()= ", Foo().class_name()) 

К сожалению, эту функцию нельзя вызывать при назначении переменной класса. class = class_nameNameError: name 'class_name' is not defined. my_class = Foo.class_name() производит NameError: name 'Foo' is not defined.

Примечание: Обновленный вопрос, чтобы использовать правильный Python термин "класс переменной", а не статическая переменная (что отражает мой C++ фон)

+0

Я попробовал последний фрагмент кода (заканчивается 'print (" Foo(). Class_name() = ", Foo(). Class_name())'), и он работает. Не могли бы вы добавить код, который не работает, а также указать желаемые результаты? – imposeren

+0

Можете ли вы перефразировать свой вопрос, не используя слова «статическая переменная»? Эта концепция не имеет смысла в мире питонов. Что именно вы хотите достичь? Вы хотите установить переменную класса? Вы хотите установить его так, чтобы экземпляры имели к нему доступ? – Oin

+0

Обновленный вопрос для использования «переменной класса» –

ответ

0
class Foo(object): 

def __init__(self): 
    self.class_name = self.__class__.__name__ 

x = Foo() 

x.class_name 

EDIT Waitaminute. Я не думаю, что я к тебе. Что вы имеете в виду со статической переменной?

+0

Статическая переменная связана с классом, а не с конкретным экземпляром класса. Поэтому статическая переменная не имеет 'self', из которой она может применяться' __class __.__ name__' –

+0

Не является ли '__name__' статическим атрибутом класса? – Gijs

+0

В поле переменной класса '__name__' возвращает имя модуля, а не имя класса. –

Смежные вопросы