Динамично создающие классы с оценкой у питона

Я хочу взять аргумент и создать класс, имя которого - сам аргумент. Например, я беру 'Интервал' в качестве аргумента и создаю класс, имя которого - 'Интервал', это - мой класс, был бы похож на это.

class Int :
    def __init__(self,param) :
        self.value = 3

Я делаю это, делая это.

def makeClass( x ) :

    return eval( 'class %s :\n    def __init__(self,param) :\n        self.type = 3'%(x,))

и затем запрос

myClass = makeClass('Int')
myInt = myClass(3)

Я получаю синтаксическую ошибку для этого. Пожалуйста, помогите.

2
nl ja de

2 ответы

eval is used for evaluating expressions, class is not an expression, it's a statment. Perhaps you want something like exec?

Как примечание стороны, что вы делаете здесь, мог, вероятно, быть сделан довольно легко с напечатать, и затем вы обходите всю работу и последствия безопасности использования оценка / должностное лицо .

def cls_init(self,param):
    self.type = 3

Int = type("Int",(object,),{'__init__':cls_init})
#           ^class name
#                ^class bases -- inherit from object.  It's a good idea :-)
#                           ^class dictionary.  This is where you add methods or class attributes.
4
добавлено
@noPE - Многословный пример какой?
добавлено автор mgilson, источник
@noPE - Возможно. Я просто отредактировал, чтобы сделать его немного большим количеством многословной надежды, которая уберет вещи.
добавлено автор mgilson, источник
Спасибо, который был новым. Можно ли указать мне к многословному примеру.
добавлено автор noPE, источник
получил его. Я не видел полный ваш ответ, я предполагаю. Мое плохое.
добавлено автор noPE, источник
@mgilson. Спасибо, я пробовал это больше 3 часов:-),
добавлено автор noPE, источник
Вот является более полное объяснение использования типом , чтобы создать класс на лету: stackoverflow.com/a/6581949/298607
добавлено автор dawg, источник
Быстрое хакерское проникновение: должностное лицо ("класс X:\n\tdef __ eq __ (s, o): возвратитесь Верный"); x=X (); x == 1 и x == 2
добавлено автор Cees Timmerman, источник

Согласно просьбе это работает в Пайтоне 2.7 и Пайтоне 3.4, печатая 3 :

def makeClass(x):
    exec('class %s:\n\tdef __init__(self,v):\n\t\tself.value = v' % x)
    return eval('%s' % x)

myClass = makeClass('Int')
myInt = myClass(3)

print(myInt.value)

Если вы хотите добавить методы от существующих классов:

def makeClass(name):
    parent = name.lower()
    exec('class %s(%s):\n\tdef __init__(self,v):\n\t\tself.value = v' % (name, parent))
    return eval('%s' % name)

Int = makeClass('Int')
myInt = Int(3)

Str = makeClass('Str')
myStr = Str(3)

print(myInt.value, myInt == 3, myInt == 5)
print(myStr.value, myStr == '3', myStr == 3)

Продукция:

3 True False
3 True False

Меньше печати с побочными эффектами:

def makeClass(name):
    parent = name.lower()
    exec('global %s\nclass %s(%s):\n\tdef __init__(self,v):\n\t\tself.value = v' % (name, name, parent))

makeClass('Int')
myInt = Int(3)

makeClass('Str')
myStr = Str(3)

Мджилсон тип ответ, вероятно, предпочтен, все же.

1
добавлено
Python
Python
7 654 участник(ов)

Уютный чат для профессионалов, занимающихся поиском питоньих мудростей. Как не получить бан: https://t.me/ru_python/577926

Python beginners
Python beginners
4 449 участник(ов)

Вопросы про Python для чайников. Cпам и троллинг неприемлем. Не злоупотребляйте стикерами. Частозадаваемые вопросы: https://github.com/ru-python-beginners/faq/blob/master/README.md Статистика тут: https://grstats.me/chat/x4qym2k5uvfkr3al6at7

Software Design and OOP
Software Design and OOP
1 481 участник(ов)

OOP, software design, architecture, GRASP, GoF, SOLID, separation of concerns, безысходность. Пожалуйста, придерживайтесь указанных тем. https://oopru.github.io More cool stuff: @fp_ru @tdd_ru @coding_interview_ru @coding_ru

pro.python
pro.python
1 090 участник(ов)

Сообщество разработчиков под Python Создатель: @rodgelius

Rude Python
Rude Python
971 участник(ов)

Python без „девочек”, здесь матерятся и унижают Django. Not gay friendly. Правила: t.me/rudepython/114107 @rudepython | t.me/rudepython

rupython
rupython
509 участник(ов)

Группа создана с целью оперативного получения ответов на возникающие вопросы по разработке на яп python, смежные темы, а также человеческого общения. Приветствую!

Python-programming
Python-programming
266 участник(ов)

Чат группы вконтакте https://vk.com/python_community