Я пытаюсь написать свою первую объектно-ориентированную программу. код я придумал это:объект 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
Спасибо. Он отлично работает. Могу я попросить еще одну вещь? Как вы можете видеть, в этом коде я делаю список всей переменной, а затем добавляю ее в список0 (что означает, что я могу сделать что-то не так). В структуре кода, который я имею в настоящее время, можно ли добавить список непосредственно в список0 вместо 'atcon.append (match.group (2) .split()) + lat0 = Lattice()' для каждого из 'atcon',' name' и 'pot'? – BaRud
@BaRud Я не могу понять, о чем вы меня спрашиваете, и у меня были проблемы с чтением кода, потому что он плохо соответствует стандартам SO. Я должен был предположить, что atcon не является частью класса Lattice. Не могли бы вы изменить свой вопрос, предоставив более подробное описание данных, целей и текущей точной реализации, потому что иначе я не могу понять, в чем ваш вопрос. Что вы подразумеваете под списком всех переменных? Я не вижу список 0 в вашем коде. Если вам нужен список объектов, вы можете просто выполнить '[Решетка (a, b, c), Lattice (d, e, f) ....]' – ljetibo
Согласен, что отступ первого кода был плохим. Я обновил полный рабочий код и образец ввода. Если ваше время позволяет, любезно взгляните. – BaRud