Python/Python 기초

[Python] Python Class

데이터 세상 2021. 2. 23. 22:33
728x90
반응형

Class

  • 클래스(Class): 객체를 만드는 구조/틀
  • 객체(Object)
    • 객체 = 속성(attribute) + 기능(method)
    • 객체 = 변수 + 함수

Class Variable

  • 클래스와 인스턴스 전체가 공유하는 변수

Class Method

  • 클래스와 인스턴스 전체가 공유하는 함수

인스턴스(Instance)

클래스가 실질적으로 실체화될 때(메모리에 할당되어 사용될 때) 그 객체를 부르는 용어

  • 클래스 선언
  • 클래스 호출을 통한 객체 할당
# Class 선언
class MyClass():
    class_var = '클래스 변수'
    
    def __init__(self, v1, v2):
        self.v1 = v1
        self.v2 = v2
    
    @classmethod
    def class_method(cls):
        print("클래스의 메소드")
	
    def instance_method(self):
        self.instance_var = '인스턴스 변수'
        print("인스턴스 메소드")  
        
# Class Instance 생성
my_class = MyClass("v1","v2")
print(my_class)
    
>> <__main__.MyClass object at 0x1593234>

Instance Variable

  • instance 고유의 변수

Instance Method

  • instance에 적용되는 함수
  • 인스턴스 메소드의 매개변수 중 가장 첫번째는 인스턴스 자신(self)
  • self: 인스턴스는 위함 placeholder, 객체 자신을 가리킴

__name__

  • 인스턴스 생성될 때 객체를 할당, 인스턴스 이름 참조

__init__(생성자)

  • 인스턴스가 생성될 때 객체의 초기값을 설정하는 method로 자동으로 호출됨

__del__(소멸자)

  • 인스턴스가 소멸될 때 자동으로 호출되는 메소드
# 클래스 이름 참조
클래스명.__name__
# 클래스 내부에서 클래스 이름 참조
self.__class__.__name__

# 클래스 변수 참조
클래스명.변수명
# 클래스 내부에서 클래스 변수 참조 
self.__class__.변수명

 

Class Inheritance

  • 부모의 클래스를 물려받음
  • 부모 클래스가 가지고 있는 함수/변수를 그대로 사용할 수 있음
  • 기존 클래스를 변형하지 않고 추가/변경 가능

Method Overriding

  • 상속을 받은 자식 클래스가 상속해준 부모 클래스의 메소드를 변형하는 방법
  • 부모 클래스의 소스 코드는 그대로 유지한 채 소스코드를 확장할 수 있음

super()

  • 자식 클래스 내에서 부모클래스를 호출
class Parent():
    def __init__(self, a ,b):
        self.a = a
        self.b = b
    
    def parent_func(self):
        print("parent function")

class Child(Parent):
    def __init__(self, a, b, c):
        super().__init__(a, b)
        # python2, 3 버전 공통 스타일
        # super(Child, self).__init__(a, b)
        self.c = c

    def parent_func(self):
        print("Function Overring")        
        

ch = Child(1,2,3)
ch.parent_func()
print(ch.a)
print(ch.b)
print(ch.c)
    
>>
Function Overring
1
2
3

 

Design Pattern

Decoration Pattern (데코레이션 패턴)

함수의 객체와 함수를 변경하는 다른 객체의 wrapping을 허용

class C(object):
	@my_decorator
	def method(self):
		# method 내용
    
# ==> 아래와 같은 의미를 갖는다.
class C(object):
	def method(self):
		# method 내용
	method = my_decorator(method)

@classmethod

  • method를 클래스 method로 변환
  • 첫 번째 인수로 클래스(cls)를 사용
  • cls: class를 위한 placeholder

@staticmethod

  • method를 정적 method로 변환
  • 첫 번째 인수로 cls나 self가 없음
class A(object):
    _hello = True
    
    def foo(self, x):
        print("foo({0}, {1}) 실행".format(self, x))

    @classmethod
    def class_foo(cls, x):
        print("class_foo({0}, {1}) 실행".format(cls, x, cls._hello))
        
    @staticmethod
    def static_foo(x):
        print("static_foo({0}) 실행".format(x))
        
a = A()
a.foo(1)
a.class_foo(2)
A.class_foo(2)
a.static_foo(3)
A.static_foo(3)

>>
foo(<__main__.A object at 0x0000022AE13054F0>, 1) 실행
class_foo(<class '__main__.A'>, 2) 실행
class_foo(<class '__main__.A'>, 2) 실행
static_foo(3) 실행
static_foo(3) 실행

 

Observer Pattern

@property

  • 특정 값을 유지하는 핵심 객체를 갖고, 직렬화된 객체의 복사본을 생성하는 일부 옵서버가 있는 경우 유용
  • 객체의 one-to-many 의존 관계에서 한 객체의 상태가 변경되면, 그 객체에 종속된 모든 객체에 그 내용을 통지하여 자동으로 상태를 갱신하는 방식
class C:
    def __init__(self, name):
        self._name = name
    
    @property
    def name(self):
        return self._name
    
    @name.setter
    def name(self, new_name):
        self._name = "{0} >> {1}".format(self._name, new_name)

c = C("진")        
print(c._name)
print(c.name)
c.name = "아스틴"
print(c.name)
    
>>
진
진
진 >> 아스틴
진 >> 아스틴

 


References

728x90
반응형

'Python > Python 기초' 카테고리의 다른 글

[Python] Python Built-in Functions  (0) 2021.02.24
[Python] Python Exception Handling  (0) 2021.02.24
[Python] Python File  (0) 2021.02.23
[Python] Python Function  (0) 2021.02.23
[Python] Python Flow Control  (0) 2021.02.22