Вопрос 3
Чтобы cls.__name__
было чем угодно, (кивком на предложение Делнана)
def f(clsname):
class XYZ:
# ...
XYZ.__name__ = XYZ
# ...
return XYZ
Вопрос 1
Причина, по которой c1 is not c2
состоит в том, что они представляют собой два разных объекта, хранятся в двух разных местах в памяти.
Вопрос 4
Попробуйте ответить на вопрос 1 и посмотрите, как это работает для вас
Вопрос 2
Это может усложнить отладку, так как их атрибуты класса __name__
имеют общее значение, и этого достаточно, чтобы избежать усилий. (см. вопрос 3). Я бы сказал, что у них нет одинаковых имен. Один из них называется C1
, а другой - C2
(по крайней мере, в той области, которую вы показываете. Если вы передадите их функции, то имя в этой области будет таким же, как имя параметра они прошли через)
На самом деле, я настолько уверен, что у них нет того же имени, что попытка сказать мне иначе может заставить меня включить музыку громче и притвориться, что я вас не слышу.
В ответ на комментарий
Это можно сделать, но это просто неправильно. Я все равно проиллюстрирую, потому что это освещает:
def f(clsname):
class XYZ(object):
pass
XYZ.__name__ = clsname
globals()[clsname] = XYZ
f('C1')
f('C2')
print C1
print C2
Это просто работает, вставляя класс в глобальный диктант, набираемый clsname
. Но какой в этом смысл? Вы можете вставить его в глобальный диктант под любым именем на самом деле, потому что это просто другое задание. Лучше всего просто вернуть класс из функции и позволить вызывающей стороне решить, какое имя дать классу в своей области видимости. У вас все еще есть атрибут __name__
класса, установленный на строку, которую вы передаете функции для отладки.