소멸자의 호출을 확인하려면 "세션 종료"[파이썬 프로그램의 완전 종료]라는 상황이 연출되어야 합니다 따라서 하나의 완전한 프로그램이 아니라 그냥 코드를 간단하게 입력해서 테스트하기 위한 용도의 위치에서는 소멸자 호출을 확인할 수 없습니다. 예를 들어서 다음과 같은 경우입니다. + 주피터 노트북(코랩 등)는 세션 종료를 하지 않습니다. + 인터랙티브 셸도 세션 종료를 하지 않습니다. + 파이썬 튜터도 세션 종료를 하지 않습니다. + IDLE도 마찬가지로 세션 종료를 하지 않습니다. 강의처럼 명령어를 사용해서 호출하는 경우가 가장 기본적인 세션 종료 상황입니다. 현재 코드를 실행하고 있는 환경을 확인해보세요!
#클래스를 선언합니다 class Student: def __init__(self, name, korean, math, english, science): self.name=name self.korean=korean self.math=math self.english=english self.science=science def get_sum(self): return self.korean+self.math+\ self.english+self.science def get_average(self): return self.get_sum()/4 def to_string(self): return"{}\t{}\t{}".format(\ self.name,\ self.get_sum(),\ self.get_average()) #학생 리스트를 선언합니다 students=[ Student("윤인성", 87, 98, 88, 95), Student("연하진", 92, 98, 96, 98), Student("구지연", 76, 96, 94, 90), Student("나선주", 98, 92, 96, 92), Student("윤아린", 95, 98, 98, 98), Student("윤명월", 64, 88, 92, 92) ] #학생을 한 명씩 반복합니다 print("이름","총점","평균",sep="\t") for student in students: print(student.to_string()) 379pg 직접 해보는 손코딩입니다 ! 책에서는 student=Student()와 같이 객체인 인스턴스를 선언해야한다고 하는데 위와 같은 코드에는 일련의 과정이 없습니다 하지만 마지막에 student.to_string()을 사용하는 것은 for student in students에서 각각의 student가 students내부에 있는 Student랑 매칭이 되어서 이와 같이 사용 되는 것인가요?
윤저자님의 강의 감사드립니다. 열심히 해서 어서 56강까지 하고 싶은 1인입니다. class 학생: def __init__(self,name, korean, math, english, science): self.n = name self.k = korean self.m = math self.e = english self.s = science def 총점(self): return self.k + self.m +\ self.e + self.s def 평균(self): return self.총점() / 4 def 출력(self): print(self.n, self.총점(), self.평균(), sep = "\t") students = [ 학생("홍길동", 10, 20, 30, 40), 학생("김철수", 15, 25, 35, 45), 학생("이영희", 26, 37, 48, 59), 학생("박정수", 31, 42, 53, 64), ] print("이름", "총점", "평균", sep="\t") for student in students: student.출력() 과 class student: def __init__(self,name, korean, math, english, science): self.n = name self.k = korean self.m = math self.e = english self.s = science def 총점(self): return self.k + self.m +\ self.e + self.s def 평균(self): return self.총점() / 4 def 출력(self): print(self.n, self.총점(), self.평균(), sep = "\t") students = [ student("홍길동", 10, 20, 30, 40), student("김철수", 15, 25, 35, 45), student("이영희", 26, 37, 48, 59), student("박정수", 31, 42, 53, 64), ] print("이름", "총점", "평균", sep="\t") for student in students: student.출력() 위에 구문은 클래스 이름 학생과 리스트에서 받은 요소 이름 student가 다른데 아래 구문은 클래스 이름 student과 리스트에서 받은 요소 이름 student가 같습니다. 그런데 결과값은 같게 나옵니다. 여기가 이해가 안되서요. 이렇게 써도 값이 같이 나오는 것이 왜 그런지요? 클래스는 선언될 때 마치 함수 몇개를 내포하고 있는 집합체 같은 느낌입니다. 이게 맞다면 이 느낌을 잡는 것이 객체지향 기계어를 배우는 과정에서 가장 중요하다고 생각이 듭니다. 그래서 self가 의미하는 것은 그 선언된 클래스 자체 같기도 하고 아닌 것 같기도 하고.. 왜 객체지향 언어가 어려운지 참 많이 느낍니다.
질문이 이해가 잘 안 되는데, 변경하면 어떤 실행 결과가 나올 것이라고 생각하신 것인지 알 수 있을까요? 클래스는 이해하고 뭘 하고 할 것도 없이 반복문 또는 함수보다 훨씬 간단한 개념입니다. 현재 설명해주시는 내용을 보면, 지난 질문도 그렇고 반복문에 대한 이해가 약간 부족하신 것으로 보입니다! 반복문 부분과 클래스 개요 부분을 여러 번 반복해서 보시는 것을 추천드립니다!
@@NoxPark 코드는 위에서 아래로 실행이 됩니다. 처음 클래스 student를 만드셨을 때는 student라는 이름으로 클래스의 객체를 만들 수 있습니다. 이어서 반복문 내부에서 student라는 이름을 만드셨으면, 이때부터 student라는 이름은 클래스가 아니게 되므로 객체를 만들 수 없습니다(클래스를 가리키고 있는 것이 아무 것도 없으므로 + 이후로는 완전히 만들 수 없게 됩니다). 그래서 일반적으로 클래스 이름은 무조건적으로 대문자로 시작하게 만들어서 이름 충돌을 피합니다.
교재 374페이지에서의 객체를 처리하는 함수(2)에서 def sum_student(student): return student["korean"] + student["math"] + student["english"] + student["science"] 이런 함수 선언의 매개변수로 student를 사용하는 이유는 마지막 for 문의 for student in students: 이 부분에서 student라는 변수로 받기 때문인가요? 또한 한가지 더 질문이 있습니다. 교재 379쪽의 클래스 내부에 함수(메소드)선언하기 부분에서 def get_average(self): return self.get_sum / 4 여기서 함수는 self.get_sum으로 불러오는데 print(student.call_student()) 여기에서는 왜 student로 불러오며 저 'student'는 어디서 가져오는건가요ㅜㅜ 클래스명에 따른 인스턴스 함수인가요?
확실히, 새로운 내용을 배우니 재미가 있으면서도 궁금증이 많이 생깁니다. 망설이다가, 질의응답을 통해서 다른분들도 도움을 더 얻으실 수 있지 않을까하는 생각에 다시 질문 남겨봅니다. 이번 강의에서 Student 라는 클래스를 생성하고, student = Student() 라는 구문을 통해 student 라는 객체를 생성하였다는 것은 잘 이해되었습니다. 그렇다면 지난 강의처럼, students = [ 학생("윤인성",87,98,88,95), 학생("연하진",92,98,96,98), 학생("구지연",76,96,94,90), 학생("나선주",98,92,96,92), 학생("윤아린",95,98,98,98), 학생("윤명월",64,88,92,92) ] 라고 작성할 경우의 객체는 리스트인 students 일까요, 아니면 리스트 내부의 아직 이름이 붙지 않은 각 요소들일까요?
둘 다 객체입니다. 그냥 관점의 차이인데, "객체 지향 프로그래밍에서는 모든 것이 객체이다"라고 생각하시는 것이 편합니다. 학생은 학생 객체이고, 학생 리스트는 학생 리스트 객체입니다. 프로그램 전체도 하나의 객체로 보는 거대한 객체 지향 관점도 있습니다(마치 사람 > 복부내장기관 > 소장 대장 등등처럼 구분되듯이).
코랩을 사용해서 클래스의 생성자, 소멸자 사용하는 코드 (7:47) 를 실행하니까 처음에 한번 실행했을 때는 객체가 생성되었습니다. 윤인성 3 으로 출력되고 그 이후로 실행했을 때는 객체가 생성되었습니다. 객체가 소멸되었습니다. 윤인성 3 이런식으로 출력 되는데 왜 이렇게 나오는건가요???
프로그래밍 언어 실행기가 한번 실행되어서 꺼질 때까지의 과정을 "한 세션"이라고 표현합니다. 강의와 책에서 python ㅇㅇ.py하고 프로그램을 실행할 때가 바로 세션을 시작하는 것이며, 명령어가 종료될 때 세션이 끝납니다. 세션이 종료될 때에 모든 변수를 메모리에서 제거합니다. 코랩은 세션을 하나 실행시킨 뒤에, 위에서 여러 코드를 실행하는 형태입니다. 따라서 세션 종료 버튼을 따로 누르지 않는한 세션이 종료되지 않으므로, 메모리에서 변수가 제거되지 않습니다. 그래서 한 세션으로 실행했다면 2. 할당 = 1. 생성 3. 출력 ---- 4. 세션 종료[소멸] 하는 과정으로 실행됩니다. 하지만 코랩에서는 처음에는 2. 할당 = 1. 생성 3. 출력 = 세션 실행 중 =[이라 소멸이 안 뜹니다][변수를 다음 칸에서 출력해보면, 내용이 그대로 들어있는 것을 알 수 있습니다]. 두 번째 실행 이후로는 2. 할당 = 1. 생성 = 3. 할당 시점에 기존의 객체가 변수와 연결이 끊기므로 이때 소멸 = 4. 출력 해서 지금 제시해주신 것처럼 실행되는 것입니다. 추가 참고로 원래 이렇게 세션 하나 띄우고 실행하는게 C#으로 구현한 파이썬 구현체 iPython에서 "노트북"이라고 이름을 붙였고, 이후 이 기능이 꽤 쓸만해서(이전에 선언한 변수를 또 들고와서 이것 저것 할 수 있다보니 편리), 이름이 "주피터 노트북"으로 변경되고, 이게 코랩 등에 사용된 것이라서, 이런 실행 형태를 "노트북" 또는 "주피터 노트북"이라고 부르기도 합니다!
잘 보고 있습니다! 좋은 강의 감사합니다!! 궁금한 게 있는데 강의 예시 코드에서 student = Student("윤인성", 3)이라는 형태를 사용하셨는데 Student("윤인성", 3)로 인스턴스를 만들고 그것을 student라는 변수에 넣은 것이라고 생각하면 될까요? 그리고 위의 말이 맞다면 인스턴스를 저장해놓은 변수를 '변수.함수()' 이런 식으로 함수를 활용하고 함수의 실행문은 'self.생성자에 있던 매개변수' 그리고 'self.함수()' 이런 식으로 생성자에게 줬던 매개변수값이나 클래스의 다른 함수들을 사용한다고 생각하면 될까요?
책 내용중 클래스함수에 대해 질문있는데요. 클래스 함수를 선언할때 @classmethod 데코레이터를 붙여 선언한다고 하였는데 그전에 계속 빠짐없이 등장한 def __init__(self, x, y)나 예제로 등장하는def get_sum(self), def get_average(self) 등도 사실 다 함수인데 왜 @classmethod를 안붙이는건가요? 클래스 안에서 선언된 함수다라는 상징적 의미밖에 없어 사실 안붙여도 되기 때문에 그냥 안붙히고 사용한건가요?
__init__은 생성자라는 특수한 함수이고, 다른 함수들은 클래스 함수가 아니라, 인스턴스 함수입니다. Student.get_sum() 형태로 실행하면 오류가 납니다. 클래스 함수로 선언한 녀석들은 Student.get_sum()처럼 클래스 이름 뒤에 바로 사용할 수 있게 됩니다!
이름 총점 평균 Traceback (most recent call last): File "/Users/gobeomseo/Documents/파이썬/object_4_class.py", line 37, in print(student.to_string()) AttributeError: 'Student' object has no attribute 'to_string' 에러가 떠요ㅠㅠ 뭐가 문제인지좀 알려주실수 있을까요?
버그를 제거한다(Debug)라는 의미로 버그 해결에 도움을 주는 기능입니다. 고급 기능으로 분류되는 내용[+ 파이썬은 사실 이 기능을 써야할 정도로 대규모의 프로그램을 만들 때 사용하지는 않고]이라 강의에서는 딱 한 번만 살짝 다루었습니다 @_@ ...![어디였는지는 기억이 잘 안나는데 ㅠ_ㅜ]
똑같은 class 코드를 반복해서 입력해서 익히는 도중에 에러가 났어요 보니까 한글 인코딩 에러인데 SyntaxError: Non-UTF-8 code starting with '\xc0' in file exp4.py on line 2, but no encoding declared; see python.org/dev/peps/pep-0263/e 2, but no encoding declared; see python.org for details 비주얼스튜디오 코드 세팅에서 한글 인코딩이 utf8이 맞는지 아니면 euckr 이 맞는지 알고 싶어요 전에 한글이 깨져서 euckr로 바꾸었거든요
@@user-rh1qt9zn7h to_string(self)로 선언한 클래스 내부함수는 print(student.to_string())으로 출력을하고 __str__(self) 의 함수는 print(str(student))로 출력을 하고 괄호안에 변수가들어가는지 . 으로출력을 하는지 이거는 외워야하나요?