데이터 형의 type을 구하는 함수를 사용하면 아래와 같이 나옴
print(type(1))
# <class 'int'>
print(type("a"))
# <class 'str'>
print(type(False))
# <class 'bool'>
int, str, bool 등을 class라고 할 수 있음
ex) int는 정수 객체를 생성하는 class
class에 의해서 만들어진 객체
ex) 정수 1,2,3,···,n 은 int 클래스의 instance
해당 class안에 어떠한 객체가 있는지 확인하기 위하여 isinstance() 함수를 사용할 수 있음
해당 class에 객체가 있으면 True / 객체가 존재하지 않으면 False
아래의 예시와 같이 사용할 수 있음
print(isinstance(1,int))
# True
print(isinstance('a',int))
# False
print(isinstance(False,bool))
# True
class를 정의하기 위해 class keyword를 사용
아래와 같이 사용
class ClassName: # class 클래스명
pass # class 공통 속성 정의
만약 class 내에 입력할 속성이 없다면 속성 부분에 "pass" 를 입력해줘야함
각 단어의 앞글자를 대문자로 사용 (파스칼 표기법)
정의된 class를 이용하여 객체를 생성할 수 있음
아래와 같이 객체를 생성
obj1=ClassName()
obj2=ClassName()
# 객체 = 클래스명()
1개의 클래스는 무수히 많은 객체를 만들 수 있음
예시)
class Student: # class 생성
pass
Jina = Student() # instance 생성
Naji = Student()
Suji = Student()
Jisu = Student()
print (type(Jina))
# <class '__main__.Student'>
print (isinstance(Suji,Student))
# True
클래스나 인스턴스에 정의되는 특성
클래스 명을 정의할 때 아래에 속성명="속성값"으로 속성을 정의할 수 있음
아래의 예시는 team 속성을 정의하는 것
class Student:
team = "A_team" # class의 team 속성 정의
Jina = Student()
Naji = Student()
Suji = Student()
Jisu = Student()
print (Jina.team) # 객체.속성명으로 속성값 확인
# A_team
print (Jisu.team)
# A_team
예시를 확인하면 class 속성은 모든 instance에 적용됨을 알 수 있다
class Student:
team = "A_team"
Jina = Student()
Naji = Student()
Suji = Student()
Jisu = Student()
print (Jina.team) # A_team
Student.team = "B_team" # class의 team 속성 변경
Student.mathclass="class_1" # class의 team 속성 추가
print (Jina.team) # B_team
print (Jisu.team) # B_team
print (Naji.mathclass) # class_1
class Student:
team = "A_team"
Jina = Student()
Naji = Student()
Suji = Student()
Jisu = Student()
Jina.number = 1
print (Jina.number) # 인스턴스 속성 추가
# 1
# 인스턴스 속성 추가
print (Naji.number)
# AttributeError: 'Student' object has no attribute 'number'
# Naji 인스턴스에는 number 속성을 추가하지 않아서 error가 뜸
class Student:
team = "A_team"
Jina = Student()
Naji = Student()
Suji = Student()
Jisu = Student()
Student.mathclass="class_1" # class 속성 지정
Naji.mathclass = "class_2" # class 속성을 인스턴스에서 변경
print (Naji.mathclass)
# class_2
# Naji의 mathclass 속성이 변경됨
print (Jina.mathclass)
# class_1
# Jina의 mathclass 속성은 유지됨
Student.mathclass="class_3" # class 속성을 변경
print (Naji.mathclass)
# class_2
# 위에서 변경된 Naji의 mathclass 속성이 유지됨
print (Jina.mathclass)
# class_3
# class의 mathclass 속성이 변경됨
클래스나 인스턴스에 속한 함수
아래의 예시와 같이 메서드를 정의할 수 있음
class Student:
team = "A_team" # class의 team 속성 정의
def method(): # class에 적용할 method 정의
실행할 함수 내용
class Student:
team = "A_team"
def describe(): # class 정의할 때 method를 정의함
print ("학생은", Student.team , "입니다.")
Jina = Student() # 클래스에 instance 생성
Naji = Student()
Suji = Student()
Jisu = Student()
Student.describe()
# 학생은 A_team 입니다.
# 클래스에서 method를 호출한 경우
Jina.describe()
# TypeError: describe() takes 0 positional arguments but 1 was given
# 인스턴스에서 method를 호출하면 호출이 되지 않음
위의 방법을 이용하면 class에서 method 호출이 가능
그러나 instance에서 method 호출이 불가능
instance에서 method 호출을 하고 싶으면 아래의 내용 참고
해당 함수를 호출한 개체를 나타냄
아래의 예시에서 self keyword 추가 설명
예시)
class Student: # class 정의
team = "A_team"
def desc(self): # 인스턴스 method 생성
print (self.name, "의 수학 클래스는 ", self.mathclass,"입니다." )
Jina = Student() # 인스턴스 생성
Naji = Student()
Suji = Student()
Jisu = Student()
Jina.name = "Jina" # 인스턴스에 속성 추가
Naji.name = "Naji"
Suji.name = "Suji"
Jisu.name = "Jisu"
Jina.mathclass = "A 반" # 인스턴스에 속성 추가
Naji.mathclass = "B 반"
Suji.mathclass = "A 반"
Jisu.mathclass = "B 반"
Jina.desc()
# Jina 의 수학 클래스는 A 반 입니다.
Jisu.desc()
# Jisu 의 수학 클래스는 B 반 입니다.
self keyword
method를 정의할 때 self.name, self.mathclass 등을 사용하였음
만약 Jina라는 instance에서 해당 method를 불러올 때
self.name --> Jina.name을
self.mathclass --> Jina.mathclass 를 불러오는 것
언더스코어 _ 가 두개 붙어있는 method
__init__
메소드__init__
의 첫번째 인자는 항상 self위의 instance 메서드 예시를 보면 인스턴스 생성 후 인스턴스에 반복적으로 속성을 추가해주었음
이런식으로
Jina = Student() # 인스턴스 생성
Naji = Student()
Suji = Student()
Jisu = Student()
Jina.name = "Jina" # 인스턴스에 속성 추가
Naji.name = "Naji"
Suji.name = "Suji"
Jisu.name = "Jisu"
Jina.mathclass = "A 반" # 인스턴스에 속성 추가
Naji.mathclass = "B 반"
Suji.mathclass = "A 반"
Jisu.mathclass = "B 반"
이러한 반복적인 일을 하지않기 위해 __init__
메소드를 사용하면 됨
사용방법 : def__init__
(self, 속성1, 속성2, ··· ) :
아래와 같이 사용
class Wecode : # class 정의
def __init__(self,name,기수,언어) : # 인스턴스 초기화
self.name = name # name을 해당 인스턴스의 name 속성으로 지정
self.기수 = 기수 # 기수를 해당 인스턴스의 기수 속성으로 지정
self.언어 = 언어 # 언어를 해당 인스턴스의 언어 속성으로 지정
obj = Wecode(name,기수,언어)
# 객체 = 클래스명(속성1,속성2,···)
# 객체 생성시 self는 입력하지 않음
__init__
method로 정해진 속성값을 다 입력하지 않았을 때예시)
class Wecode :
def __init__(self,name,기수,언어) :
self.name = name
self.기수 = 기수
self.언어 = 언어
Jina=Wecode('Jina','7기','python')
# 객체를 생성할 때 속성을 전부 입력한 경우
# 인스턴스를 생성할 때 속성과 함께 생성
print (Jina.언어)
# python
Junyoung=Wecode('Junyoung','7기')
# 객체를 생성할 때 속성을 전부 입력하지 않은 경우
# TypeError: __init__() missing 1 required positional argument: '언어'
위의 예시와 같이 속성을 전부 입력하지 않을시, error 발생
위의 class Student 예시를 __init__
method를 사용하여 간단하게 만들면 아래와 같다
class Student:
team = "A_team"
def __init__ (self,name,mathclass) :
self.name = name
self.mathclass = mathclass
def desc(self):
print(self.name, "의 수학 클래스는 ", self.mathclass,"입니다." )
Jina = Student("Jina","A 반")
Naji = Student("Naji","B 반")
Suji = Student("Suji","A 반")
Jisu = Student("Jisu","B 반")
Jina.desc()
# Jina 의 수학 클래스는 A 반 입니다.
Jisu.desc()
# Jisu 의 수학 클래스는 B 반 입니다.
ref) 위키백과 클래스 (컴퓨터 프로그래밍)
ref) https://wikidocs.net
ref) https://python.bakyeono.net