2015-07-05 4 views
0
class Node(): 
    def __init__(self, value, nex = None): 
     self.value = value 
     self.nex = nex 

class List(Node): 
    def __init__(self): 
     self.head = Node(6) 

    def ins(self, val): 
     exec('b = Node(val)') 
     self.head.nex = b 

Моя цель - установить любую строку в качестве имени переменной.Можно ли использовать exec() для создания экземпляра класса в python?

+0

Я не вижу причин, чтобы это было невозможно. Оператор exec выполняется в текущей области. использование 'b = exec ('Node (val)')' должно работать нормально, но этот пример не показывает никакого добавленного значения для использования 'exec'. Можете ли вы продемонстрировать, какова цель его использования в вашем случае? – MasterAM

ответ

0

Очевидно, это потому, что ваш код работает (хотя я не думаю, что он делает то, что вы намерены делать, вероятно, вы захотите изменить List.head во время List.ins() или что-то в этом роде).

>>> class List(Node): 
...  def __init__(self): 
...   self.head = Node(6) 
...  def ins(self, val): 
...   exec('b = Node(val)') 
...   self.head.nex = b 
... 
>>> x = List() 
>>> x.ins('a') 
>>> x.head.value 
6 
>>> x.head.nex.value 
'a' 

Что касается установки «любой строки» в качестве имени переменной, которая работает слишком

>>> exec ("%s = %s" % (raw_input(),raw_input())) 
a 
'b' 
>>> a 
'b' 

Но если серьезно, на самом деле, абсолютно не должны когда-либо делать что-либо (вы почти никогда не должны использовать Exec вообще). Это буквально откроет вашу программу до полного захвата. Если вы пытаетесь загрузить файл конфигурации или что-то еще, подумайте об использовании этих строк в качестве словарных ключей вместо имен переменных. «Песочница» - вход.

+0

первый раз, используя переполнение стека, не уверен, что если вы сможете увидеть мой ответ с помощью «@yourname», то оставьте комментарий здесь, чтобы вы могли его увидеть. –

+0

Я еще не могу прокомментировать ваш ответ (новичок SO SO), поэтому в отношении вашего ответа: да, вы можете использовать setattr. Тем не менее, я бы этого не сделал, особенно не с помощью ввода пользователем. Слишком много возможностей для эксплойтов или нечетных поломки. –

0

@Benny Mackney я нашел еще один способ сделать это с помощью SetAttr:

class Node(): 
    def __init__(self, value = None, nex = None): 
     self.val = value 
     self.nex = nex 

class List(Node): 
    def __init__(self): 
     self.head = Node() 

    def ins(self): 
     li = [] 
     for i in range(10): 
      setattr(self,'n' + str(i), Node(i)) 


     #self.n0.nex = self.n1 
     #self.n1.nex = self.n2 
     #self.n2.nex = self.n3 
     #. 
     #. 
     #. 
     #self.n8.nex = self.n9 

так что теперь я 9 узлов из self.n0 в self.n9 как я соединить их таким образом я могу получить : self.head.nex = self.n0 self.n0.nex = self.n1 и т. Д.

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