2016-06-15 1 views
1

У меня есть очень простой общий класс с аргументами ключевого слова только:Можем ли мы иметь другой атрибут __name__ для разных алиасов класса Python?

class genObj(object): 
    def __init__(self, **kwargs): 
     for kwa in kwargs: 
      self.__setattr__(kwa, kwargs[kwa]) 

Теперь я хочу использовать это для различных объектов, с различными параметрами, используя имя псевдонима, как следующее:

rectangle = genObj 
rr = rectangle(width=3, height=1) 

circle = genObj 
cc = circle(radius=2) 

Он работает нормально. Нет проблем. Я хочу, чтобы класс знал, с каким псевдонимом оно используется. Теперь, если я спрошу:

rr.__class__.__name__ 
>> "genObj" 

cc.__class__.__name__ 
>> "genObj" 

То, что я хочу, чтобы получить «прямоугольник» для запроса Р.Р., и «круг» для куб.см запроса. Возможно ли вообще? Как?

ответ

1

Проблема в том, что способ, которым он был установлен, circle и rectangle - это один и тот же объект (в этом случае), поэтому circle.__name__ is rectangle.__name__. Самый чистый способ получить то, что вы, что imo, состоит в том, чтобы сделать circle и rectangle оба подкласса genObj. Вы могли бы сделать что-то вроде этого:

class genBase(object): 
    def __init__(self, **kwargs): 
     for kwa in kwargs: 
      self.__setattr__(kwa, kwargs[kwa]) 

def genObj(name): 
    return type(name, (genBase,), {}) 

circle = genObj("circle") 
print issubclass(circle, genBase) 
# True 
c = circle(r=2) 
print type(c).__name__ 
# circle 
+0

ОК, приемлемо. Работа, спасибо. – user2800464

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