Programming/Python

[ Python_심화 ] 4. 클래스_02

Jerrykim91 2020. 6. 27. 01:03
반응형

4. 파이썬 심화 - 클래스_02


0. 비공개 속성 & 비공개 메서드


비공개 속성


앞에서 설명했지만 익숙해지기 위해서 다시 언급하고 넘어간다.

  • 공개 속성(public attribute)     : 클래스 외부에서 접근
  • 비공개 속성(private attribute) : 클래스 내부에서만 접근 가능

비공개 매서드


비공개 속성과 유사한 형태로 사용 가능하다.

비공개 메서드도 메서드를 클래스 바깥으로 드러내고 싶지 않을 내부에서만 호출되어야 하는 때 사용한다.


# 비공개 메소드 
    
    class Bank:
    
        def __Account(self):
            print('money')
     
        def Payment(self):
            self.__Account()    # 호출가능 
     
    BoA = Bank()
    BoA.__wallet()    # 에러

1. 위치 인수 & 키워드 인수


클래스로 인스턴스를 만들 때 위치 인수와 키워드 인수를 사용 가능하다.

규칙 : 위치 인수와 리스트 언패킹을 사용하려면 *args 를 사용하면 가능

매개변수에서 값을 가지고 오려면 args[0] 이렇게 사용!!!


    class Person():
        
        def __init__(self, *args):   # 위치인수 : *args
            
            self.name   = args[0]
            self.age    = args[1]
            self.adress = args[2]
    
    Jerry = Person(*['제리', 30, '부산'])

만약에 키워드 인수와 딕셔너리 언패킹을 사용하려면

다음과 같이 **kwargs 를 사용하면 된다.

매개변수에서 가져오는 값은 kwargs ['키값'] 이렇게 하면 된다.


    class Person():
        
        def __init__(self, **kwargs):   # 키워드인수 : **kwargs
            
            self.name   = kwargs['name']
            self.age    = kwargs['age']
            self.adress = kwargs['address']
    
    Jerry_frt = Person( name = '제리', age = 30, address = '부산'] )
    Jerry_snd = Person( **{ 'name' : '제리', 'age' :  30, 'adress' : '부산'} )   


2. 인스턴스 생성 후 속성 추가 + 특정 속성만


__init__ 메서드뿐 아니라

클래스로 인스턴스를 만든 뒤 인스턴스.속성 = 값 형식으로 속성을 계속 추가 가능하다.


	# 예제 
    
    class Person:           # 빈클래스 생성 
         pass
    
    Joy = Person()          # 인스턴스 생성
    Joy.name = '조이'       # 인스턴스를 만든 뒤 속성 추가 -> 해당 인스턴스에만 생성 
    Joy.name                # 다른 인스턴스에서는 추가한 속성이 생성안됨 
    
    # outPut
    # >>> '조이'
    
    
    ### 다른 인스턴스에서는 추가한 속성이 생성안됨 -> 예시 
    
    Jun = Person()          # Jun 인스턴스 생성 
    Jun.name                # Joy 인스턴스에만 name 속성을 추가 -> Jun 인스턴스에는 name X

에러가 발생하였다.


    # outPut
    # >>> Traceback (most recent call last):
    #   File "<pyshell#11>", line 1, in <module>
    #     Jun.name
    # AttributeError: 'Person' object has no attribute 'name'
    
    

메서드를 호출하고 속성을 부여하면 동작한다.


    # 예제 
    
    class Person:           # 빈클래스 생성 
    
        def greeting(self):
            self.hello = '안냥'
    
    Joy = Person()          # 인스턴스 생성
    Joy.hello               # 아직은 속성 x 
    
    # 그럼 다시 
    Joy.greeting()          # greeting 메소드를 호출
    Joy.hello               # hello 속성 o
    
    # outPut
    # >>> '조이' 

인스턴스는 자유롭게 속성을 추가 가능 하지만

특정 속성만 허용, 다른 속성은

제한하고자 할 때 클래스에서 __slots__ 에 허용할 속성 이름(속성의 이름은 반드시 문자열!)을 리스트이어야 한다.


    # 예제
    
    class Person: 
        __slots__ = ['name', 'age']    # name, age만 허용(다른 속성은 생성 제한)
    
    
    Joy        = Person()             
    Joy.name   = '조이'               # 속성 허용 
    Joy.age    = 30                   # 속성 허용 
    Joy.adress = '인천'               # 허용안됨 -> 추가할 때 에러가 발생함

 




Reference