Найти - Пользователи
Полная версия: Создать новый класс по подобию старого
Начало » Python для новичков » Создать новый класс по подобию старого
1 2
dissdoc
Всем привет. Вопрос такой. Как мне создать новый класс по образу и подобию исходного. Есть исходных класс SourceClass. Как только не пытался. Что делаю
Хочу вот что-то вроде этого
# Source Class
cls = SourceClass()
# Есть у него значения переменных
cls.name = 'MyName'

# Теперь создаю новый класс
# так
new_class = super(object, cls).__new__
# так
new_class = cls.__new__(cls.__name__, cls.__bases__, cls.__dict__)
# и еще миллион способов :( Ничего не получается
Идея, чтобы new_class был того же типа и с теми же параметрами, что и SourceClass
o7412369815963
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
это нужно?

> Идея, чтобы new_class был того же типа и с теми же параметрами, что и SourceClass
с теми же или с такими же?

если нужно скопировать экземпляр, то можно выполнить copy.deepcopy

Зачем это все?
dissdoc
Это все нужно для создания динамических классов, когда заранее не известно какой из классов SourceClass или TestClass будет являться шаблоном)
То или не то, сейчас проверить не могу. Но глубокое копирование очень и очень подкупает. Нужно проверить..
dissdoc
Это все же не то что нужно. Необходимо при создании класса, как бы вызвать метод __new__
Точнее. Попробую более подробно описать проблему.

Фактически она должна вовзращать что-то вроде cls() (или __new__)
что-то вроде
return super(MyClass, cls).__new__
Но я не пойму, что я делаю не так, какой первый параметр вставлять, если нам известен cls (<class ‘__main__.MyClass’>) со всеми методами и параметрами
dissdoc
Сам разобрался. Нашел в книге Бизли
new_cls = cls.__new__(cls, cls.__bases__, cls.__dict__)
if isinstance(new_cls, cls):
cls.__init__(new_cls)
Fibio
class NewClass(SourceClass): pass - а так нельзя?
bw
>>> 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
o7412369815963
bw
Я никак не могу понять что требуется.
и я.

Попробовал запустить на ру2.7 и 3.2, код не работает - cls.__new__ принимает только 1 параметр
dissdoc
Сам разобрался. Нашел в книге Бизли
new_cls = cls.__new__(cls, cls.__bases__, cls.__dict__)
if isinstance(new_cls, cls):
cls.__init__(new_cls)
Может автор хочет метаклассы?
см http://www.py-my.ru/post/4e04bc2c1d41c86c33000000
bw
> cls.__new__ принимает только 1 параметр
Вообще-то да, не обратил внимания на этот говнокод. Он же принимает класс и аргументы для инициализации экземпляра.

..bw
dissdoc
Да, у меня есть в коде метаклассы. Я не мог доходчиво объяснить это. Именно, создавал экземпляр класса, так, чтобы он принимал методы и метакласса и класса родителя.
И отработал мой “говнокод” так, как мне этого требовалось

По поводу кода new_cls = cls() - улыбнуло, потому что я не догадался сделать это так просто) спасибо!
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB