2015-02-25 3 views
0

Я пытаюсь написать свою первую объектно-ориентированную программу. код я придумал это:объект python с полным списком

class Lattice: 
     'Commomn base for all sublattice' 
     latc = 0 

     def __init__(self, conc, name, pot): 
      self.atcon = atcon 
      self.name =name 
      self.pot=[] 
      Lattice.latc += 1 
    atcon=[] 
    with open(inpf, "r") as f: 
     for line in f: 
      match = re.search(reall, line) 
      if match: 
       if (match.group(1).strip() == "atcon"): 
        atcon.append(match.group(2).split()) 

print("CON =>"+str(atcon)) 
print("CON[0] =>"+str(atcon[0])) 
lat0=Lattice(atcon[0],pot[0],name[0]) 
print("lat0 =>"+str(lat0.atcon)) 

Я ожидал, что lat0.atcon будет atcon[0] Но результат последних 3 оператора печати является:

CON =>[['0.5d0', '0.50d0'], ['0.98d0', '0.02d0'], ['0.98d0', '0.02d0'], ['0.98d0', '0.02d0']] 
CON[0] =>['0.5d0', '0.50d0'] 
lat0 =>[['0.5d0', '0.50d0'], ['0.98d0', '0.02d0'], ['0.98d0', '0.02d0'], ['0.98d0', '0.02d0']] 

Я не понимаю, почему. Я абсолютный новичок и без формального обучения питону (обучение с использованием сети и SO), поэтому, пожалуйста, проявляйте терпение.

Обновление: После принятого ответа это код, с которым я в настоящее время работает. Проблема с этим, я читаю все в list, а затем вставить тот список в lat0 т.е.

#if match found 
    atcon.append(match.group(2).split()) 
# after getting all match, in global scope 
lat0=Lattice(atcon[0],name[0],pot[0]) 

Итак, я думаю, что я либо тратить list или объект lat0. Возможно ли, чтобы я сразу заполнил lat0, когда матч найден? , например.

#if match found for <name> 
    lat0=Lattice(name) 

mini.py:

#!/usr/bin/env python3 
import sys 
import re 


class Lattice: 
    'Commomn base for all sublattice' 
    latc = 0 

    def __init__(self, conc, names, pots): 
     self.atcon = conc 
     self.name =names 
     self.pot=pots 
     Lattice.latc += 1 

reall='(.*)\s*=\s*(.*)' 
inpf = sys.argv[1] 
print(inpf) 

with open(inpf, "r") as f: 
    pot=[] 
    name=[] 
    atcon=[] 
    for line in f: 
     match = re.search(reall, line) 
     if match: 
      if (match.group(1).strip() == "atcon"): 
       atcon.append(match.group(2).split()) 

      if (match.group(1).strip() == "pot"): 
       pot.append(match.group(2).split()) 

      if (match.group(1).strip() == "name"): 
       name.append(match.group(2).split()) 

lat0=Lattice(atcon[0],name[0],pot[0]) 
print("POT =>"+str(pot)) 
print("NAME =>"+str(name)) 
print("CON =>"+str(atcon)) 
print("CON[0] =>"+str(atcon[0])) 
print("lat0 =>"+str(lat0.pot)) 

Типичные Входной

pot=Rh1.pot Rh2.pot Fe1a.pot Fe2a.pot 
    name=Rh-up Fe-up 
    atcon=0.5d0 0.50d0 

    pot=Rh3.pot Rh4.pot Fe3a.pot Fe4a.pot 
    name=Rh-up Fe-up 
    atcon=0.98d0 0.02d0 

ответ

1

Я держу пари, что вы либо написал или тестировал этот класс в IDLE. В этот момент я уверен, что это действительно запутывает, но ошибка очень проста. Когда вы создаете экземпляр своего класса, обычно рекомендуется использовать значения, отправленные в __init__, а не ссылки на другие.

class Lattice: 
    'Commomn base for all sublattice' 
    latc = 0 

    def __init__(self, conc, name, pot): 
     self.atcon = conc 
     self.name =name 
     self.pot=pot 
     Lattice.latc += 1 

Что случилось, что atcon, pon и name были определены в глобальном масштабе, и вы ссылаться их как в примере ниже:

atcon=[1, 2, 3, 4, 5, 6] 
pot = [7,8,9] 
name = ["foo", "bar"] 

class globs: 
    def __init__(self): 
     self.atcon = atcon 
     self.pot = pot 
     self.name = name 

Который дал следующий результат:

>>> g = globs() 
>>> g.atcon 
[1, 2, 3, 4, 5, 6] 
>>> g.pot 
[7, 8, 9] 
>>> g.name 
['foo', 'bar'] 

РЕДАКТИРОВАТЬ Ответ на расширенное редактирование исходного вопроса.

Я думаю, что получаю. Еще две вещи меня путают:

  • Если я следую коду, похоже, вы хотите получить только 1-й удар в файле как lat0. Но вы не объяснили, хотите ли вы только 1-го попадания в файл или список объектов всех хитов.
  • Вы делаете разделение, но в соответствии с вашим примером ввода, который все равно будет возвращать список, то есть ["Rh1.pot", "Rh2.pot", "Fe1a.pot", "Fe2a.pot"], я мог бы быть самонадеянным, но я добавил [0] после раскола, чтобы получить только 1-й удар. Удалите это, если я пропустил точку.

Вот код, который остановит цикл после первого попадания. Я объявляю atcon, pot и name как списки, потому что .split() вернет список, но я не добавляю результаты, чтобы не тратить память. Я также return Lattice объект для выхода из функции и не тратить время на разбор остальных строк.

Кроме того, окончательный if atcon and pot and name должен избегать возврата в случае, если есть текст, который соответствует, но не содержит всю важную информацию. В python if пустого списка будет False. Вы можете оставить остальную часть кода как есть (кроме операторов печати).

inpf = sys.argv[1] 
print(inpf) 

def parse(inpf): 
    atcon, pot, name = [], [], [] 
    reall='(.*)\s*=\s*(.*)' 
    with open(inpf, "r") as f: 
     for line in f: 
      print(line) 
      if match:    
       if (match.group(1).strip() == "atcon"): 
        atcon = match.group(2).split()[0] 

       if (match.group(1).strip() == "pot"): 
        pot = match.group(2).split()[0] 

       if (match.group(1).strip() == "name"): 
        name = match.group(2).split()[0] 

       if atcon and pot and name: 
        return Lattice(atcon, name, pot) 

lat0 = parse("test.txt") 
print("lat0 =>"+str(lat0.pot)+" "+str(lat0.name)+" "+str(lat0.atcon)) 

Проверено на

atcon=0.5d0 0.50d0 
atcon=0.5d0 0.50d0 
atcon=0.5d0 0.50d0 

pot=Rh1.pot Rh2.pot Fe1a.pot Fe2a.pot 
name=Rh-up Fe-up 
atcon=0.5d0 0.50d0 

pot=Rh3.pot Rh4.pot Fe3a.pot Fe4a.pot 
name=Rh-up Fe-up 
atcon=0.98d0 0.02d0 

Выход:

lat0 =>Rh1.pot Rh-up 0.5d0 
+0

Спасибо. Он отлично работает. Могу я попросить еще одну вещь? Как вы можете видеть, в этом коде я делаю список всей переменной, а затем добавляю ее в список0 (что означает, что я могу сделать что-то не так). В структуре кода, который я имею в настоящее время, можно ли добавить список непосредственно в список0 вместо 'atcon.append (match.group (2) .split()) + lat0 = Lattice()' для каждого из 'atcon',' name' и 'pot'? – BaRud

+0

@BaRud Я не могу понять, о чем вы меня спрашиваете, и у меня были проблемы с чтением кода, потому что он плохо соответствует стандартам SO. Я должен был предположить, что atcon не является частью класса Lattice. Не могли бы вы изменить свой вопрос, предоставив более подробное описание данных, целей и текущей точной реализации, потому что иначе я не могу понять, в чем ваш вопрос. Что вы подразумеваете под списком всех переменных? Я не вижу список 0 в вашем коде. Если вам нужен список объектов, вы можете просто выполнить '[Решетка (a, b, c), Lattice (d, e, f) ....]' – ljetibo

+0

Согласен, что отступ первого кода был плохим. Я обновил полный рабочий код и образец ввода. Если ваше время позволяет, любезно взгляните. – BaRud

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