Class

Jina·2020년 3월 31일
0

Today I Learned

목록 보기
7/21

class

  • 특정 객체를 생성하기 위해 변수와 메소드를 정의하는 틀
  • 객체를 정의하기 위한 상태와 메서드(함수)로 구성
  • 데이터와 기능을 함께 묶는 방법

데이터 형의 type을 구하는 함수를 사용하면 아래와 같이 나옴

print(type(1))
#  <class 'int'>

print(type("a"))
#  <class 'str'>

print(type(False))
#  <class 'bool'>

int, str, bool 등을 class라고 할 수 있음

ex) int는 정수 객체를 생성하는 class

instance

class에 의해서 만들어진 객체

ex) 정수 1,2,3,···,n 은 int 클래스의 instance

instance 확인하기

해당 class안에 어떠한 객체가 있는지 확인하기 위하여 isinstance() 함수를 사용할 수 있음

사용방법 : isinstance(객체,class)

해당 class에 객체가 있으면 True / 객체가 존재하지 않으면 False

아래의 예시와 같이 사용할 수 있음

print(isinstance(1,int))
# True

print(isinstance('a',int))
# False

print(isinstance(False,bool))
# True

class 정의

class keyword

class를 정의하기 위해 class keyword를 사용
아래와 같이 사용

class ClassName: 	 	# class 클래스명
	pass 			# class 공통 속성 정의

만약 class 내에 입력할 속성이 없다면 속성 부분에 "pass" 를 입력해줘야함

class 명명 규칙

각 단어의 앞글자를 대문자로 사용 (파스칼 표기법)

  • 파스칼 표기법: 단어와 단어를 대문자로 구별하는 방법
  • ex) PythonProgramming

객체 생성

정의된 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

Attribute

클래스나 인스턴스에 정의되는 특성

class 속성 (class 변수)

  • 클래스가 가지는 공통 성질 / 속성
  • 클래스 내의 모든 인스턴스가 공유하는 속성
  • .속성명 과 같이 사용함

클래스 속성만들기 : 속성명="속성값"

클래스 명을 정의할 때 아래에 속성명="속성값"으로 속성을 정의할 수 있음

아래의 예시는 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명.속성명 = "속성값"


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

instance 속성 (instance 변수)

  • 각 인스턴스 고유의 속성
  • 클래스 및 다른 인스턴스와 공유되지 않음

인스턴스 속성 만들기 : 인스턴스명.속성명 = "속성값"

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 속성이 변경됨

Method

클래스나 인스턴스에 속한 함수

아래의 예시와 같이 메서드를 정의할 수 있음


class Student:
    team = "A_team"  		# class의 team 속성 정의

	def method():		# class에 적용할 method 정의
    	실행할 함수 내용

class에서 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 호출을 하고 싶으면 아래의 내용 참고


instance에서 method 호출

인스턴스를 기준으로 method 호출 할 때

  • 메서드를 호출하는 인스턴스 자신이 첫번째 인자로 메서드에 전달 되어야함
  • class에서 호출하는 방식으로 method를 호출하면 첫번째 인자로 자신이 들어오지 않았기 때문에 error 발생 (발생하는 에러는 위의 class에서 method 호출 목차 참고)
  • self keyword 이용

self keyword

해당 함수를 호출한 개체를 나타냄
아래의 예시에서 self keyword 추가 설명

정의방법 : def method_name(self) :

사용방법 : 인스턴스명.method_name()

예시)

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 를 불러오는 것


special method

언더스코어 _ 가 두개 붙어있는 method

__init__ 메소드

  • 초기화(initialize) 메서드
  • 클래스의 객체가 만들어질 때 자동으로 호출
  • 새로 만들어지는 객체가 갖게 될 여러 가지 성질을 정해주는 일
  • __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

0개의 댓글