리스트에 있는 값들에 클래스를 사용하고 싶은데 (코드와 에러메시지 추가)

조회수 7874회

a = class()

b = class()

c = class()

.

.

z = closs()

클래스를 사용하기 위해서는 " 인스턴스 = 클래스() " 로 입력 해야한다고 봤습니다. 이런 식으로 a 부터 z 까지 일일이 입력하는 것이 아니라 리스트를 만들고 반복문을 만들었습니다. 그리고 인스턴스가 몇개 만들어 졌는지 확인하기 위해서 클래스메소드에 함수를 만들어 count를 확인했습니다.

my_list = [ 'a', 'b', 'c' .... 'z' ]

카운트는 알파벳 수인 26개로 확인되었습니다. type(a) 를 입력해서 타입을 확인 해봤습니다. 찾을 수 없다는 에러 메세지가 나왔습니다.

직접 a = class() 라고 입력하면 인스턴스가 만들어지고 type 을 확인 했을 때도 class 가 맞는데, 리스트와 반복문을 사용 했을때는 인스턴스가 리스트 길이 만큼 만들어 졌지만 type 을 확인 했을 때는 찾을 수 없다는 에러 메서지가 나왔습니다.

왜 이런 결과가 나오는지 궁금합니다.

7월 29일 질문에 코드와 에러메세지를 추가합니다.


class Test_class:
    count = 0

    def __init__(self):
        Test_class.count += 1

    @classmethod
    def print_count(cls):
        print('{0}개 입니다.'.format(cls.count))


Test_list = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i']


def test_def():

    list2 = []
    index0 = 0

    for i in range(len(Test_list)):
        n = index0
        target = Test_list[index0]
        list2.append(target)
        k = Test_list[index0]
        k = Test_class()
        index0 = index0 + 1

    print(list2)


test_def()

Test_class.print_count()

['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i']
9개 입니다.

실행시간: 13.80ms

여기 까지는 잘 진행이 된 것 처럼 확인이 됩니다.

이후 type(a) 를 입력하면 다음과 같은 에러 메세지가 나타납니다.

type(a)

실행 중 오류가 발생했습니다.
Traceback (most recent call last):
File "/solution.py", line 36, in <module>
type(a)
NameError: name 'a' is not defined
  • 코드와 에러메시지 질문에 넣어주세요. nowp 2019.7.29 02:27
  • 코드와 에러 메시지를 질문에 넣었습니다. 잘 부탁드립니다. 알 수 없는 사용자 2019.7.29 11:47

1 답변

  • 변수 a와 문자열 "a"는 전혀 다른 겁니다.

    a = 'b'
    b = 'a'
    

    이런 것도 가능하죠. OK?

    Test_listTest_class 인스턴스 26개를 넣고 싶다면,

    Test_list = [ Test_class() for i in range(26) ]
    

    이렇게 하면 됩니다. 이 각 인스턴스를 a, ... , z 까지의 변수에 넣으려면 (왜 다루기 힘들게 a, b, c...란 이름으로 저장하고 싶은지는 모르겠지만.)

    a = Test_list[0]
    b = Test_list[1]
    # ... 
    z = Test_list[25]
    

    이렇게 하면 되겠습니다.


    추가 댓글에 대해 답을 해 보겠습니다.

    올려주신 코드가 왜 의도대로 되지 않는지 설명해 볼게요.

    코드에서 Test_list 에 Test_class 인스턴스를 집어넣기 위해 다음과 같이 하고 있습니다.

    Test_list = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i']
    
    #... for 문 안에서
    k = Test_list[index0]   # Test_list 중에 하나를 꺼내옴. k = 'c' 라고 합시다.
    k = Test_class()        # Test_class 인스턴스를 생성하여 k 에 assign 함. 이걸 질문자는 c = Test_class() 와 동일하다고 생각하는 듯 함.
    

    위 코드에서 k = Test_class() 문은 a = Test_class(), b = Test_class() 를 대체하지 못합니다. k 가 바로 위 문장에서 "c" 가 되었다고 합시다. 그러면, k = Test_class() 문이 c = Test_class() 가 될까요? 제가 첫 답변 첫머리에 말씀드렸듯이, 변수 c와 문자열 "c" 는 전혀 다릅니다. 이 부분을 먼저 이해하셔야 할 듯 합니다.

    이것을 이해한다면, 다음에 나온 에러도 이해가 갈 것입니다.

    type(a) 를 했을 때에는, 앞에서 a 변수를 만들어 쓴 적이 없기 때문에, name 'a' is not defined라고, a라는 (변수의) 이름이 정의되지 않았다는 에러가 발생하는 것입니다.

    maria, james 등의 이름의 Person 인스턴스를 만들어 관리하고 싶다면, 변수명으로 maria, james 등을 지정하는 것은 아무런 의미가 없습니다. maria, james 등의 이름이 중요한 데이터라면, 그 이름들을 저장할 Person 클래스의 멤버변수를 만들어서, 거기에 이름을 저장하여 사용하면 됩니다. 변수명은 p, q, r 이 되었든, persons[0], persons[1], .. 이 되었든 아무런 상관이 없어요.

    OK?

    • 답변 감사드립니다. 하지만 제가 생각했던것과 다소 차이가 있어서 다시 한번 질문 드립니다. 예를 들어 Person 이라는 클레스를 만들고 james = Person() 이라고 입력한 후 print(james) 를 입력하면 __main__.Person instance at 0x7fbed2a7b5f0 라고 나옵니다. idle 에서 확인 했을 때는 class '__main__.Person이라고 확인 할 수 있었습니다. 제가 찾고 있는 방법은 james, maria, John ... 등 10명, 100명, 1000명의 명단이 있을 때, 직접 james = Person(), maria = Person(), John = Person() ... 이런 식으로 10번 100번 직접 입력하지 않고 리스트나 다른 파일에 있는 목록과 for 반복문 사용하여 "= Person()" 클래스에 인스턴스를 반복해서넣으려는 것입니다. 클래스메소드에서 count +=1 로 인스턴스가 몇번 생성되고 작동하였는지 확인하려 하였습니다. 제가 질문으로 올린 코드는 카운트 수는 맞지만, 함수를 실행하고 type을 확인 하였을 때는 에러메세지가 나왔습니다. idle 에서 확인 할 때는 type(jaems) 를 입력 하면 class '__main__.Person 메세지를 확인 할 수 있었습니다. 코드 실행기에서는 type(james) 로 입력하면 아무것도 나오지 않았습니다. print(type(james)) 입력하면 type 'instance' 로 확인됩니다. 하지만 반복문으로 실행 후 type 을 확인 했을 때, NameError: name 'james' is not defined 메세지가 나와서 왜 그런지 궁금합니다. 알 수 없는 사용자 2019.7.29 23:41

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)