Форум сайта python.su
Всем привет. Вопрос такой. Как мне создать новый класс по образу и подобию исходного. Есть исходных класс SourceClass. Как только не пытался. Что делаю
Хочу вот что-то вроде этого
# Source Class
cls = SourceClass()
# Есть у него значения переменных
cls.name = 'MyName'
# Теперь создаю новый класс
# так
new_class = super(object, cls).__new__
# так
new_class = cls.__new__(cls.__name__, cls.__bases__, cls.__dict__)
# и еще миллион способов :( Ничего не получается
Отредактировано (Ноя. 25, 2011 14:31:39)
Офлайн
import copy
class SourceClass(object):
def foo(self):
return 'foo'
cls = SourceClass()
cls.name = 'MyName'
B = type('B',(cls.__class__,),copy.deepcopy(cls.__dict__))
b = B()
print b.foo(), b.name
Офлайн
Это все нужно для создания динамических классов, когда заранее не известно какой из классов SourceClass или TestClass будет являться шаблоном)
То или не то, сейчас проверить не могу. Но глубокое копирование очень и очень подкупает. Нужно проверить..
Офлайн
Это все же не то что нужно. Необходимо при создании класса, как бы вызвать метод __new__
Точнее. Попробую более подробно описать проблему.
Фактически она должна вовзращать что-то вроде cls() (или __new__)
что-то вроде
return super(MyClass, cls).__new__
Офлайн
Сам разобрался. Нашел в книге Бизли
new_cls = cls.__new__(cls, cls.__bases__, cls.__dict__)
if isinstance(new_cls, cls):
cls.__init__(new_cls)
Офлайн
class NewClass(SourceClass): pass - а так нельзя?
Офлайн
>>> new_cls = cls.__new__(cls, cls.__bases__, cls.__dict__)
>>> cls.__init__(new_cls)
Эквивалентно:
>>> new_cls = cls()
Ну и понятно, что new_cls, это никакой не класс, а экземпляр класса cls.
Я никак не могу понять что требуется.
> Это все нужно для создания динамических классов…
>>> new_cls = new.classobj('new_cls', (base_cls1,), {})
Что значит “динамических классов”? В Python всё динамическое. Предыдущая запись эквивалентна:
>>> class new_cls(base_cls1): pass
..bw
Офлайн
bwи я.
Я никак не могу понять что требуется.
dissdocМожет автор хочет метаклассы?
Сам разобрался. Нашел в книге Бизлиnew_cls = cls.__new__(cls, cls.__bases__, cls.__dict__)
if isinstance(new_cls, cls):
cls.__init__(new_cls)
Офлайн
> cls.__new__ принимает только 1 параметр
Вообще-то да, не обратил внимания на этот говнокод. Он же принимает класс и аргументы для инициализации экземпляра.
..bw
Офлайн
Да, у меня есть в коде метаклассы. Я не мог доходчиво объяснить это. Именно, создавал экземпляр класса, так, чтобы он принимал методы и метакласса и класса родителя.
И отработал мой “говнокод” так, как мне этого требовалось
По поводу кода new_cls = cls() - улыбнуло, потому что я не догадался сделать это так просто) спасибо!
Офлайн