클래스 객체로 이해력 나열
Nov 26 2020
subfile.py에 StrucData라는 클래스가 있습니다.
class StrucData:
def __init__(self, name):
self.name=name
def loadData(self, size=1, cost=1):
self.size=size
self.cost=cost
기본 파일에서 I :
- 서브 파일을 호출하고,
- 데이터 이름 목록 생성
- 목록을 반복하여 개체를 인스턴스화합니다. 과
- 각 개체에 대해 'loadData'메서드를 사용하여 데이터를로드합니다 (이 예제를 쉽게 만들기 위해 동일한 '크기'와 '비용'을 사용하고 있습니다.)
from subfile import StrucData
listIndex=['data1','data2','data3']
# Create a list of objects
listObjects=[]
# Iterate through the list of objects
for i in range(3):
data=StrucData(listIndex[i])
data.loadData(size=3, cost=4)
listObjects.append(data)
내가하려는 것은 목록 이해력을 사용하여 동일한 작업을 수행하여
listObjects=[object1, object2, object3]
그리고 나는 같은 것을 시도했다
listObjects=[[StrucData(listIndex[i]) for k in range(3)] listObjects[i].loadData(size=3, cost=4) for i in range(3)]]
물론 작동하지 않지만 올바르게 수행하는 방법을 모르겠습니다.
목록 이해력을 사용하여 원하는 출력을 얻기 위해 내 코드에 대한 조언을받을 수 있습니까 ??
답변
1 BillHuang Nov 26 2020 at 19:00
당신은 추가 할 수없는 경우 return self
의 마지막 줄 StrucData.loadData()
에서 subfile.py
이 같이 단순화 될 수 :
# in the main file
listObjects = [StrucData(idx).loadData(size=3, cost=4) for idx in listIndex]
그렇지 않으면 loadData()
목록 이해 표현식에 대해 아무것도 반환하지 않기 때문에이 작업을 별도로 수행해야합니다 .
listObjects = [StrucData(idx) for idx in listIndex]
for i in range(3):
listObjects[i].loadData(size=3, cost=4)
2 DavidFrancosCuartero Nov 26 2020 at 19:26
Bill Huang의 응답을 보완하여 객체를 자유롭게 변경할 수없고 두 번 반복하지 않으려면 도우미 함수를 추가 할 수 있습니다.
def load_data(idx, size, cost):
result = StructData(idx)
result.loadData(size, cost)
return result
[load_data(x, size=3, cost=4) for x in range(3)]
참고로, 인스턴스에서 이름과 loadData를 구분할 필요가 없다면 namedtuple을 사용할 수 있습니다.
from collections import namedtuple
StructData = namedtuple('StructData', ['name', 'size', 'cost'])
print([StructData(name=x, size=3, cost=4) for x in range(3)])
Wich는 다음을 반환합니다.
[StructData(name=0, size=3, cost=4),
StructData(name=1, size=3, cost=4),
StructData(name=2, size=3, cost=4)]
마지막으로 "data1", "data2"와 같은 이름이있는 것을 확인하고이를 클래스 이름으로 사용할 수 있습니다. 이름이 유효한 클래스 식별자 인 한 namedtuple을 사용하여 그렇게 할 수 있습니다.
from collections import namedtuple
list_index = ['data1', 'data2', 'data3']
print([namedtuple(name, ['size', 'cost'])(3, 4) for name in list_index])
결과:
[data1(size=3, cost=4), data2(size=3, cost=4), data3(size=3, cost=4)]