[Python] Object, Class

pingping·2020년 12월 30일
0
post-thumbnail
# 객체 지향

( 개인 정리 용입니다. )

  • class, object

  • quardrangle 클래스

    • height
    • color
    • width

  • instance = class()

  • Class에는 속성과 메서드가 있음

    • 파이썬 method는 항상 첫 번째 파라미터로 self 사용
      • 인자가 필요없을 때에도 self 사용
    • 클래스의 attribute는 내부에서 접근시, self.attfibute명 으로 접근

객체지향 문법 (상속)

상속

  • 추상화 (abstraction) : 여러 클래스에 중복되는 속성, 메서드를 하나의 기본 클래스로 작성

  • 상속 (inheritance) : 기본 클래스의 공통 기능을 물려받고, 다른 부분만 추가 or 변경하는 것

    • 부모 클래스, 자식 클래스, ....
  • 코드 재사용이 가능, 공통 기능의 경우 기본 클래스 코드만 수정하면 된다는 장점

  • 부모 클래스가 둘 이상인 경우는 다중 상속 이라고 부름

class Car:
    def __init__(self, name):
        self.name = name
    
    def get_info(self):
        print(self.name)
    
class ElectronicCar(Car):
    def get_info(self):
        print(self.name , " Electronic")

class GasolineCar(Car):
    def get_info(self):
        print(self.name , " Gasoline")

        

test_car = ElectronicCar("pingping")
hello_car = GasolineCar("pingping")

test_car.get_info()
hello_car.get_info()
  • 메서드 오버라이드 : 덮어씌우기, 기존 기능이 새로운 기능으로 재정의

  • issubclass, isinstance → 내장 함수

  • init : 생성자

  • super

    자식 클래스에서 부모 클래스의 method를 호출할 때 사용

    super().부모 클래스명의 method명

class Person:
		def work(self):
				print('work hard')

class Student(Person):
		def work(self):
				print('Study Hard')

		def parttime(self):
				super().work()
  • self
    • 현재의 객체를 나타냄
    • self.method명 또는 attribute명 으로 호출한다.

클래스 속성과 메서드

1. 클래스 변수와 인스턴스 변수 (attribute를 한 단계 더 구분해보자)

  • 클래스 변수 : 클래스 정의에서 메서드 밖에 존재하는 변수

    • 해당 클래스를 사용하는 모두에게 공용으로 사용되는 변수
    • 클래스 변수는 클래스 내, 외부에서 '클래스명.변수명'으로 액세스 가능
  • 인스턴스 변수 : 클래스 정의에서 메서드 안에서 사용되면서 'self.변수명'처럼 사용되는 변수

    • 각 객체별로 서로 다른 값을 가짐
    • 클래스 내부에서는 self.인스턴스변수명을 사용하여 액세스, 클래스 밖에서는 객체명.인스턴스변수명으로 액세스
  • 클래스 변수, 생성자, 인스턴스 변수, 클래스 변수 접근, 인스턴스 변수 접근, ....

instance, static, class method

  • instance method : 해당 객체 안에서 호출 ( 지금까지 다룬 self.메서드명 )
    • 해당 메서드를 호출한 객체에만 영향을 미침
    • 객체 속성에 접근 가능
  • static method : 객체와 독립적이지만, 로직상 클래스내에 포함되는 메서드
    • self 파라미터를 가지고 있지 않음
    • 객체 속성에 접근 불가-
    • 정적 메서드는 메서드 앞에 @staticmethod 라는 Decorator를 넣어주어야 함
    • 클래스명.정적메서드명 or 객체명.정적메서드명 둘 다 호출 가능
class Figure:
    # 생성자 (Initializer)
    def __init__(self, width, height):
        self.width = width
        self.height = height
    
    # 메서드
    def clac_area(self):
        return self.width * self.height
    
    # 정적 메서드 (Figure 에 너비와 높이가 같은 도형은 정사각형임을 알려주는 기능)
    @staticmethod
    def is_square(rect_width, rect_height):
        if rect_width == rect_height:
            print("square")
        else:
            print('Not square')

figure1 = Figure(2, 3)
figure1.is_square(5, 5)

Figure.is_square(4, 2) 

class method : 해당 class 안에서 호출

  • self 파라미터 대신, cls 파라미터를 가짐
  • 클래스 변수 접근 가능하며, cls.클래스변수명 으로 액세스 가능, 단 객체 속성/메서드 접근 불가
  • 클래서 메서드는 메서드 앞에 @classmethod 라는 Decorator를 넣음
  • 클래스명.클래스메서드명 or 객체명.클래스메서드명 둘 다 가능
class Figure:
    # 생성자 (Initializer)
    def __init__(self, width, height):
        self.width = width
        self.height = height
    
    # 메서드
    def clac_area(self):
        return self.width * self.height
    
		# 클래스 메서드
		@classmethod
		def print_count(cls):
				return cls.count
class Figure:
    @classmethod
    def set_name(cls, name):
        cls.name = name
    
class Circle(Figure):
    pass

# 범위가 classmechod는 해당 클래스 안이다. 그래서 Circle set_name을 호출하면 바뀌지 않음

# staticmethod : 아예 별개의 함수
# classmethod  : 해당 클래스만을 범위로 한다.

Figure.set_name('Figure')
print(Figure.name, Circle.name)

Circle.set_name('Circle')
print(Figure.name, Circle.name)
  • 출처 : 잔재미코딩
profile
Cloud Infra Engineer & interested in python, IaC, k8s

0개의 댓글