[참고] 저자 본인의 공부 및 참고용으로 쓰여진 글인점을 알려드립니다.
# 코딩도장의 내용입니다.
https://dojang.io/mod/page/view.php?id=2373
클래스에서 속성을 만들고 사용하기.
속성(attribute) 를 만들 때는 __init__ 메서드 안에서 self.속성 에 값을 할당한다.
class 클래스이름 :
def __init__(self) :
self.속성 = 값
class Person :
def __init__(self) :
self.hello = "안녕하세요" # attribute
def greeting(self) :
print(self.hello)
james = Person()
james.greeting() # 안녕하세요
>>> 안녕하세요
Person 클래스의 __init__ 메서드에서 self.hello 에 "안녕하세요" 라는 인사말을 넣었다.
__init__ 메서드는 james = Person() 처럼 클래스에 () 괄호 를 붙여서 인스턴스를 만들 때 호출되는 특별한 메서드입니다. 즉, __init__(initialize) 이라는 이름 그대로 인스턴스(객체)를 초기화합니다.
초기화(initialization) : 프로그래밍에서 데이터 object 나 변수의 초깃값 할당을 의미한다. 초기화는 컴퓨터 프로그램의 최초 또는 미리 정해진 계수, 스위치, 주소, 기억장치의 내용 등을 '0' 또는 기타의 값으로 설정하는 것을 말한다.
특히 이렇게 앞 뒤로 __ (밑줄 두 개) 가 붙은 메서드는 파이썬이 자동으로 호출해주는 메서드인데, 스페셜 메서드 (special method) 또는 매직 메서드(magic method) 라고 부른다. 앞으로 파이썬의 여러 가지 기능을 사용 할 때 이 스페셜 메서드를 채우는 식으로 사용하게 된다.
속성(attribue)은 __init__ 메서드에서 만든다는 점과 self 에 .(점) 을 붙인 뒤 값을 할당한다는 점이 중요합니다. 클래스 안에서 속성을 사용할 때도 self.hello 처럼 self 에 점을 붙여서 사용하면 된다.
# self 의 의미
self 는 인스턴스 자기 자신을 의미합니다. 인스턴스가 생성될 때 self.hello = "안녕하세요." 처럼 자기 자신에 속성을 추가했다. 여기서 __init__ 메서드의 매개변수 self 에 들어 가는 값은 Person() 이라고 할 수 있다. 그리고 self 가 완성된 뒤 james 에 할당된다. 이후 메서드를 호출하면 현재 인스턴스가 자동으로 매개변수 self 에 들어온다. 그래서 greeting 메서드에서 print(self.hello) 처럼 속성을 출력할 수 있었던 것.
<https://velog.io/@magnoliarfsit/RePython-1.-self-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0> 블로그에서 말하기로는
객체의 인스턴스 그 자체를 말한다. 즉, 객체 자기 자신을 참조하는 매개변수인 셈이다. 객체 지향 언어는 모두 이걸 메소드에 안보이게 전달하지만, 파이썬은 클래스의 메소드를 정의할 때 self 를 명시한다. 메소드를 불러올 때 self 는 자동으로 전달된다. self 를 사용함으로 클래스내에 정의 한 멤버에 접근할 수 있게 된다.
# 인스턴스를 만들 때 값 받기.
__init__ 메소드에서 self 다음에 값을 받을 매개변수를 지정한다. 그리고 매개변수를 self.속성에 넣어준다.
class 클래스이름 :
def __init__(self, 매개변수1, 매개변수2) :
self.속성1 = 매개변수1
self.속성2 = 매개변수2
class Person :
def __init__(self, name, age, address) :
self.hello = "안녕하세요."
self.name = name
self.age = age
self.address = address
def greeting(self) :
print('{} 저는 {} 입니다.'.format(self.hello, self.name))
maria = Person("maria", 20, "서초구 반포동")
maria.greeting() # '안녕하세요 저는 maria 입니다.'
print("이름:", maria.name) # maria
print("나이:", maria.age) # 20
print("주소:", maria.address) # 서초구 반포동
__init__ 메서드를 보면 self 다음에 name, age, address 를 지정했다. 그리고 메서드 안에서는 self.name = name 처럼 매개변수를 그대로 self 에 넣어서 속성으로 만들었다.
클래스 안에서 속성에 접근할 때는 self.속성 형식, 클래스 바깥에서 속성에 접근할 때는 인스턴스.속성 형식으로 접근. maria.name, maria.age, maria.address 같이 접근. 이렇게 인스턴스를 통해 접근하는 속성을 인스턴스 속성이라고 부른다.
참고 | 클래스의 위치 인수, 키워드 인수
클래스로 인스턴스를 만들 때 위치 인수와 키워드 인수를 사용할 수 있습니다. 규칙은 함수와 같습니다. 위치 인수와 리스트 언패킹을 사용하려면 다음과 같이 *args 를 사용하면 됩니다. 이때 매개변수에서 값을 가져오려면 args[0] 처럼 사용해야 한다.
class Person :
def __init__(self, *args) :
self.name = args[0]
self.age = args[1]
self.address = args[2]
arguments = ['yhlee', 20, masan]
maria = Person(*args)
키워드 인수와 딕셔너리 언패킹을 사용하려면 다음과 같이 **kwargs 를 사용하면 된다. 이때 매개변수에서 값을 가져오려면 kwargs['name'] 처럼 사용해야 한다.
class Person :
def __init__(self, **kwargs) : # 키워드 인수
self.name = kwargs['name']
self.age = kwargs['age']
self.address = kwargs['address']
maria1 = Person(name = 'yhlee', age = 20, address = 'masan')
keywords_arguments = {'name' : 'yhlee', 'age' : 20, 'address' : 'masan'}
maria2 = Person(**keywords_arguments)
참고 | 인스턴스를 생성한 뒤에 속성 추가하기, 특정 속성만 허용하기
지금까지 클래스의 인스턴스 속성은 __init__ 메서드에서 추가한 뒤 사용했습니다. 하지만 클래스로 인스턴스를 만든 뒤에도 인스턴스.속성 = 값 형식으로 속성을 계속 추가할 수 있다. 다음 Person 클래스는 빈 클래스이지만 인스턴스를 만든 뒤 name 속성을 추가할 수 있다.
class Person :
pass
maria = Person() # 인스턴스 생성
maria.name = "마리아" # 인스턴스를 만든 뒤 속성 추가
maria.name
>>> '마리아'
이렇게 추가한 속성은 해당 인스턴스에만 생성된다. 따라서 클래스로 다른 인스턴스를 만들었을 때는 추가한 속성이 생성되지 않는다. 인스턴스 간에는 독립성이 존재.
james = Person() # james 인스턴스 생성
james.name # maria 인스턴스에만 name 속성을 추가했으므로 james 인스턴스에는 name 속성이 없음
인스턴스는 생성한 뒤에 속성을 추가할 수 이씅므로 __init__ 메서드가 아닌 다른 메서드에서도 속성을 추가할 수 있다. 단, 이때는 메서드를 호출해야 속성이 생성된다.
class Person :
def greeting(self) :
self.hello = "안녕하세요" # greeting 메서드에서 hello 속성 추가
maria = Person()
maria.hello # 아직 속성이 없음
Traceback (most recent call last):
File "<pyshell#22>", line 1, in <module>
maria.hello
AttributeError: 'Person' object has no attribute 'hello'
maria.greeting() # greeting method 를 호출해야
maria.hello # hello 속성이 생성된다.
>>> '안녕하세요'
인스턴스는 자유롭게 속성을 추가할 수 있지만 특정 속성만 허용하고 다른 속성은 제한하고 싶을 수도 있다. 이때는 클래스에서 __slots__ 에 허용할 속성 이름을 리스트로 넣어주면 된다. 특히 속성 이름은 반드시 문자열로 지정해준다.
__slots__ = ['속성이름1', '속성이름2']
class Person :
__slots__ = ['name', 'age'] # name , age 만 허용 (다른 속성은 생성 제한)
maria = Person()
maria.name = '마리아' # 허용된 속성
maria.age = 20 # 허용된 속성
maria.address = '서울시 서초구 반포동' # 허용되지 않은 속성은 추가할 때 에러가 발생함.
Traceback (most recent call last):
File "<pyshell#32>", line 1, in <module>
maria.address = '서울시 서초구 반포동'
AttributeError: 'Person' object has no attribute 'address'
'Programming > Python' 카테고리의 다른 글
[클래스] 클래스 속성과 인스턴스 속성 알아보기 (0) | 2023.03.13 |
---|---|
[클래스] 비공개 속성 사용하기 (0) | 2023.03.12 |
[클래스] Class 사용하기 (0) | 2023.03.12 |
모듈/패키지/라이브러리 (0) | 2022.03.31 |
if __name__ == "__main__" (0) | 2022.03.31 |