파이썬 클래스

이승수·2021년 10월 13일
0

1. 클래스 생성

class AAA:         # 클래스
    BBB = ‘Hello’   # 속성
    
AAA.BBB → 'Hello'출력 # 클래스의 속성에 접근

2. 클래스 내에 함수 선언

class AAA:         
    BBB = ‘Hello’
    def print_hello():    클래스 내에서 작동하게 되는 함수 → 메서드(method)
         print(‘Hello World”)
         
AAA.print_hello() → 'Hello'출력

3. self

  • 인스턴스에서 활용 가능하려면
class AAA:         
    BBB = ‘Hello’
    def print_hello(self):     self를 넣어줘야함
         print(‘Hello World”)
클래스를 활용해 인스턴스를 생성하고 print_hello 메서드를 부르기
i_AAA = AAA()

i_AAA.print_hello() → 'Hello'

함수를 호출할 때 아무런 인수를 넘기지 않고 그저 함수를 실행했고
다만 메소드 내에서 파라미터를 self 하나 받도록 설정했다
이렇게 할 수 있는 이유는 파이썬에서 인스턴스가 메서드나 특성을 사용할 때 자동으로 그 인스턴스에 대한 참조값을 넘기지만 자동으로 받도록 하지는 않기 때문이다

따라서 함수를 실행하게 될 때는 poke_a 인스턴스에 대한 참조값이 자동으로 넘겨지지만 실제로 함수를 실행할 때 파라미터 설정이 되어 있지 않게 되는 경우에는 필수 인수가 0이라 불일치한 현상이 발생하는 것이죠

4. 생성자 함수

생성자 함수는 클래스가 인스턴스화 (instantiate) 될 때 사용되는 함수

새로운 인스턴스를 생성하게 될 때 생성자 함수가 따로 정의되어 있지 않은 경우에는 파이썬의 기본 생성자 함수를 사용하게 되어 있습니다.

class AAA:
    def __init__(self, BBB='Hello'):
        self.BBB = BBB

i_AAA = AAA()
print(i_AAA.BBB) → 'Hello'

위 코드처럼 클래스를 기반으로 생성되는 인스턴스는 클래스의 생성자 함수에 따라 인스턴스의 초기 속성들을 받을 수 있다. 하지만 이는 인스턴스마다의 속성이지 클래스 전체에 대한 속성은 아니어서 클래스 자체에서는 이러한 속성들에 대한 접근이 안된다.

예를 들어 다음과 같은 코드에서 Pokemon 클래스는 인스턴스의 속성에 접근 할 수 없다

print(AAA.BBB) → AttributeError: type object 'AAA' has no attribute 'BBB'


클래스 특별 메소드

파이썬에서 사전에 정의가 되어 있는 메소드들이 존재

1. @property(메소드를 특성처럼 취급해 가져온다)

파이썬에서는 클래스를 만들고 해당 클래스 특성들을 설정해 줄 수 있다

이렇게 클래스 특성들을 생성할 때 self 를 통해서 생성해 줄 수도 있지만 여러 변수가 연결되거나 특별히 관리가 필요한 경우 등 이러한 상황들에서는 따로 함수로 작동하는 방식으로 관리해 줄 수 있다

class Person:
	def __init__(self, first_name, last_name):
		self.first_name = first_name
		self.last_name = last_name
		self.full_name = self.first_name + ' ' + self.last_name

name = Person('Lee', 'SS')

print(name.first_name)  →  'Lee'
print(name.last_name)   →  'SS'
print(name.full_name)   →  'Lee SS'

만약에 여기에서 first_name 을 Kim 로 변경하면

name.first_name = 'Kim'

# 생성자 함수가 실행될 때에 값이 정해지고 바꿔지지 않는다
print(name.first_name)  →  'Kim'
print(name.full_name)   →  'Lee SS'  # 변경 X 

변경하려면

class Person:
	def __init__(self, first_name, last_name):
		self.first_name = first_name
		self.last_name = last_name

	def full_name(self):
		return self.first_name + ' ' + self.last_name
 
name.first_name = 'Kim'
print(name.first_name)  →  'Kim'
print(name.full_name)   →  'Kim SS'  # 변경 O

※ @property 사용
해당 메소드를 클래스의 특성 (attribute) 처럼 접근할 수 있다

class Person:
	def __init__(self, first_name, last_name):
		self.first_name = first_name
		self.last_name = last_name

	@property
	def full_name(self):
		return self.first_name + ' ' + self.last_name
        
name = Person('Lee', 'SS')

name.first_name = 'Kim'

print(name.first_name)  →  'Kim'
print(name.full_name)   →  'Kim SS'

이런 식으로 클래스 내에 다른 특성들과 연관이 되어 있는 특성들을 관리할 때 사용을 할 수 있다

2. getter, setter

full_name 을 설정하게 되면 first_name 을 바꿔주는 방법

  1. getter 란 어떤 것을 가져올 때 사용
    (@property 를 설정했을 때 이미 어떻게 가져올지 정해졌으니까 별도로 설정을 할 필요는 없다)
  2. setter 의 경우에는 값을 설정해주는 행동
    (setter 의 경우에는 값을 설정해주는 행동이기 때문에 별도로 메소드를 만들어준다)
class Person:
	def __init__(self, first_name, last_name):
		self.first_name = first_name
		self.last_name = last_name

	@property ← 메소드 위에 @property를 쓰면 그 메소드가 getter 메소드가 된다
	def full_name(self):
		return self.first_name + ' ' + self.last_name
		
	@full_name.setter
	def full_name(self, new_full_name):
		first_name, last_name = new_full_name.split()
		self.first_name = first_name
		self.last_name = last_name
  • @property 를 통해서 이렇게 메소드를 특성으로 만들어주게 되면 그 뒤에는 해당 특성 이름을 사용해서 setter 를 설정할 수 있다
  • @full_name.setter 는 그저 full_name 을 변경할 때 어떻게 바꾸는지 알려주는 함수이다
name = Person('Lee', 'SS')

print(name.first_name) → 'Lee'
print(name.full_name) → 'Lee SS'

name.full_name = 'Kim WW'    # 풀네임 변경

print(name.first_name) → 'Kim'
print(name.last_name) → 'WW'
print(name.full_name) → 'Kim WW'

3. _(single underscore), __(dunderscore)

변수나 함수에 특별한 의미를 부여할 때 사용
생성자 함수(init)는 클래스를 통해서 인스턴스를 생성하게 해주는 특별한 용도의 함수이기 때문에 앞뒤로 두 개의 밑줄을 붙여준다
파이썬에서는 이를 'double underscore' 혹은 'dunderscore' 라고한다

  • single underscore
    파이썬 클래스 내부에서 따로 변수나 값을 저장할 때 사용되기도 한다
class AAA:
	_CCC = 100

    def __init__(self, BBB='some'):
        self.BBB = BBB

i_AAA = AAA()
print(i_AAA._CCC)  → 100

※ 다만 이렇게 클래스 내부 변수나 값으로 사용하더라도 파이썬에서는 외부에서 접근할 수가 있다
(_는 아무기능이 없는 대신 개발자들에게 경고표시다)

  • double underscore (dunderscore)
    파이썬 클래스 내부에서만 관리하도록 밑줄을 두 개 사용
class AAA:
	__CCC = 100

    def __init__(self, BBB='some'):
        self.BBB = BBB

i_AAA = AAA()
print(i_AAA.__CCC)  → Error

※ 밑줄을 두 개 사용하게 된다면 정해준 이름을 사용하지 않고
_<클래스 이름>_<변수 혹은 함수 이름> 으로 변경된다

즉, 위에서는 __CCC 가 _AAA__CCC 로 변경

밑줄을 두 개 사용한다고 해서 클래스 내부에서만 접근 가능한 private 개념이 되는 것이 아닌 여전히 public 개념

print(i_AAA._AAA__CCC) → 100

파이썬에서는 온전한 private 한 개념이 없다
따라서 이러한 방법들을 통해서 파이썬 클래스 내부 값들을 외부에서 접근하기 힘들게 할 수는 있지만 접근이 불가하지는 않다

profile
AI/Data Science

0개의 댓글