파이선 속성/메서드의 모든 것?!

정은경·2021년 3월 17일
0

1. 파이선의 모든 속성(attribute)들

  • 인스턴스 속성
  • 클래스 속성

1-0. 인스턴스 속성 vs. 클래스 속성

  • 클래스 속성: 모든 인스턴스가 공유. 모든 인스턴스 전체가 사용해야 하는 값을 저장할 때
  • 인스턴스 속성: 인스턴스별로 독립되어 있음. 각 인스턴스가 값을 따로 저장해야 할 때 사용

1-1. 인스턴스 속성

>>> class Foo:
...     def __init__(self):
...         self.a = "a"
...
>>> 
>>> f = Foo()
>>> f.a
'a'
>>> Foo.a
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: type object 'Foo' has no attribute 'a'
>>>
  • "init"이라는 매직메소드로 만드는 속성은 "인스턴스 속성"이다

1-2. 클래스 속성

>>> class Foo:
...     a = "a"
...
>>>
>>> Foo.a  # 클래스로 속성 'a'에 접근
'a'
>>> f = Foo()  
>>> f.a    # 인스턴스(self)로 속성 'a'에 접근
'a'
>>>
>>> f.__dict__
{}
>>> Foo.__dict__
mappingproxy({'__module__': '__main__', 'a': 'a', '__dict__': <attribute '__dict__' of 'Foo' objects>, '__weakref__': <attribute '__weakref__' of 'Foo' objects>, '__doc__': None})
>>>
  • 클래스 속성은 클래스에 바로 속성을 만든다
  • 클래스 속성은 클래스로도 인스턴스(self)로도 접근가능하다!
  • 왜냐하면 해당 인스턴스 속성이 없으면 클래스 속성에서 찾기 때문에 가능한 것!

    속성, 메서드 이름을 찾는 순서
    인스턴스 > 클래스 순

  • 이 클래스 속성은 보통 어떨 때 쓰는 걸까?! 아직까지는 업무에 써본적이 없다

2. 파이썬의 모든 메소드

  • 인스턴스 메소드 => 인스턴스(self)를 통해 접근
  • 정적 메소드 => 클래스에서 바로 호출 가능 => 순수함수 만들 때!
  • 클래스 메소드 => 클래스에서 바로 호출 가능 => 클래스 속성/메소드 접근할 때!

2-0. 언제 어떨 때 인스턴스/정적/클래스 메소드를 쓰는 걸까?

????

2-2. 정적 메소드

class IAmClass:
    def __init__(self):
    	self.a = 1
    
    @staticmethod
    def i_am_method(para1, para2): # 파라미터에 "self"가 없어요!
        pass
  • 정적 메소드는 파라미터에 self를 받지 않는다
  • 그러니깐, "self.a"와 같은 인스턴스 속성에는 접근할 수 없다!
  • 즉! 정적메소드는 인스턴스 속성, 인스턴스 메서드가 필요 없을 때 사용한다!!
  • 무엇은 정적 메소드롤 만들어야 할까?
  • 정적 메소드는 실행이 외부 상태에 영향을 끼치지 않는 순수 함수(pure function)를 만들 때 사용
  • 정적 메소드는 인스턴스의 상태를 변화시키지 않는 메소드를 만들 때 사용

    순수 함수 (pure functino)
    순수 함수는 부수 효과(side effect)가 없고 입력 값이 같으며 언제나 같은 출력값을 반환

2-3. 클래스 메소드

class IAmClass:
	count = 0
    def __init__(self):
        self.a = 1

	@classmethod
	def i_am_method(cls, para1, para2): # 파라미테어 cls가 있어요!!
        print(cls.count)
  • 클래스 메소드는 첫번째 파라미터가 "cls"이다!!
  • 클래스 메서드는 정적 메서드처럼 인스턴스 없이 호출 할수 있음!
  • 클래스 메소드는 메소드 안에서 "클래스 속성, 클래스 메소드"에 접근해야할 때 사용!!

Reference

profile
#의식의흐름 #순간순간 #생각의스냅샷

0개의 댓글