본문 바로가기
공부기록/Python

6월 13일 python - 클래스

by project100 2023. 6. 13.

클래스 : 자바의 클래스와 같은 개념

 

작성법)

클래스는 'class'에 클래스 이름을 지정하고 ' : '(콜론)을 붙인 뒤 다음 줄부터 'def'로 메서드를 작성한다.

여기서 메서드는 클래스 안에 들어있는 함수를 뜻한다.

이 때, 인스턴스 메서드의 첫 번째 매개 변수는 반드시 'self'를 지정해야 한다. 무조건 넣어주어야 한다.

매개변수가 필요한 경우 두번째에 지정 (self, a) 

 

실제 객체 - 인스턴스

자바스크립트 - 백엔드까지 접목시켜서 발전하고 있음! Node.js 

 

class 클래스명:

         def  메서드명(self):

                실행문장.....

 

# 클래스 정의(선언)
class info:
    def show_info(self):
        print('hi!')
        
# 클래스 사용(인스턴스 생성)
data1 = info()

data1.show_info()

# 매개변수 넣어준 것
class info:
    def show_info(self, a):
        print('hi!', a)

data1 = info()

data1.show_info('welcome')

 

참고) 자바에서 this(와 super)를 사용하는 이유

인스턴스 자기 자신을 다른 인스턴스와 구분하기 위해서 this 사용. 어느 위치에 있는지가 중요함

-> 같은 클래스로 여러 인스턴스를 만든다. 같은 이름을 이름을 갖는 변수와 메소드가 많아짐

this 에는 인스턴스의 주소가 저장된다.

 

# 클래스 정의(선언)
class info:
    def show_info(self, a):
        print('hi!', a)
    def add(self, a, b):
        print(f'{a} + {b} = {a + b:2d}')
        
# 클래스 사용(인스턴스 생성)
data1 = info()

data1.show_info('welcome')
data1.add(10, 5)

TypeError: info.add() takes 2 positional arguments but 3 were given - self 없을 때 오류

 

 

pass -  키워드

함수, 클래스에 내용을 작성하지 않는 빈 함수, 빈 클래스를 만들 때 사용하는 키워드

추상 메소드, 추상 클래스 만들 때 사용한다.(정의만 해놓고 개념을 구체적으로 정의할 수 없을 때 사용. 존재만 함)

 

     def func1():

           pass

    

     class cls1:

           pass

 

클래스의 속성(a.k.a 맴버변수) 사용하기

초기화

     def __init__(self):

           self.속성명 = 값

 

     __init__ : 초기화 메소드, 인스턴스가 생성될 때 처음으로 실행되는 메소드

 

     def __init__(self, 변수1, 변수2, ....):

           self.속성명1 = 값1

           self.속성명2 = 값2

          .....

 

     인스턴스명 = 클래스명(값1, 값2, ....)

 

 클래스명(값1) -> def 변수1 -> self. 속성명1 = 값1

 

__속성__ : 특수한 메소드, 변수

# 초기화
class PersonInfo:
    def __init__(self, name, age, address):
        self.name = name
        self.age = age
        self.address = address
        
    def show_info(self):
        print('이름 : ',self.name)
        print('나이 : ',self.age)
        print('주소 : ',self.address)
        
person1 = PersonInfo('강준아', 20, '서울시')
person1.show_info()

# 빈 클래스로 시작하여 속성을 추가
class ProdInfo:
    pass

prod1 = ProdInfo()
prod1.name = 'TV'
prod1.price = 1000000

print(prod1.name,':', prod1.price)

prod2 = ProdInfo()
#print(prod2.name) - 오류, 인스턴스만 생성된 것임, 속성이 없음

# 메소드에서 속성 생성
class ProdInfo2:
    def start(self):
        self.va = '오늘의 할일!'
        
p1 = ProdInfo2()
#print(p1.va) - 오류, start가 실행되어야 실행
p1.start() # 메소드로 속성을 만들 경우 반드시 메소드를 먼저 실행해야 함
print(p1.va)


# 정해진 속성 외 추가 금지 __slots__
class PersonInfo2:
    __slots__ = ["name", "age"]
    
person2 = PersonInfo2()
person2.name = "전우치"
person2.age = 25
# person2.address = "서울시" - 오류, 속성추가 안 됨

AttributeError: 'ProdInfo' object has no attribute 'name'

AttributeError: 'ProdInfo2' object has no attribute 'va'

AttributeError: 'PersonInfo2' object has no attribute 'address'

 

 

비공개 속성(메소드) 작성하기 : private과 유사한 속성, 속성명 앞에 '__'를 붙임. 메소드 안에서만 쓸 수 있게 제약을 걸음

     self.__val = 값

 

     def __method1(self): 비공개 메소드, 내부적으로만 호출해서 사용가능

     ......

 

     def method2(self):

           self.__method1()

class ProdInfo3:
    def __init__(self, name, price, amount):
        self.name = name
        self.__price = price
        self.amount = amount
        
    def discount(self, price):
        self.__price -= price
    
    def show_info(self):
        print(self.name)
        print(self.__price)
        print(self.amount)
    
    
book = ProdInfo3('파이썬 따라하기', 20000, 10)
print(book.name)
#print(book.__price) - 오류, 비공개, 변경불가
print(book.amount)   
book.discount(5000)
book.show_info()

AttributeError: 'ProdInfo3' object has no attribute '__price'

 

인스턴스 속성과 클래스 속성

인스턴스 속성 : 'self.' 이 붙는 속성.

클래스 속성 : 자바의 멤버처럼 작성

형식)

        class 클래스명:

                  속성 = 값

 

비공개 클래스 속성 : 앞에 '__'를 붙임

        class 클래스명:

               __속성 = 값

 

        def 메소드명(self):

              클래스명.__속성 형식으로 사용

class Box:
    entry = [] # 공통, 하나의 공간에 합쳐서 저장됨
    
    def __init__(self):
        self.e = [] # 인스턴스 별로 각자 저장됨
    
    def put_entry(self, item):
        self.entry.append(item)
        
b1 = Box()
b1.put_entry('신발')
b1.e.append('안경')
b1.e.append('핸드폰')

b2 = Box()
b2.put_entry('가방')
b2.e.append('열쇠고리')

print(f'b1 : {b1.entry}')
print(f'b2 : {b2.entry}')
print(f'b1.e : {b1.e}')
print(f'b2.e : {b2.e}')

class AdiminMember:
    # doc string
    '''관리자용 클래스입니다.''' # 클래스의 첫번째 줄에 위치해야 한다.
    __pass = '1234' 
    
    def get_pass(self):
        '''비밀번호 지정'''
        print(AdiminMember.__pass)
        
    def set_pass(self, ps):
        AdiminMember.__pass = ps  

print(AdiminMember.__doc__)    
admin = AdiminMember()
#print(admin.__pass) - 오류, 비공개
print(admin.get_pass.__doc__)
admin.set_pass('4567') # 번호 변경
admin.get_pass()

 

AttributeError: 'AdiminMember' object has no attribute '__pass'

 

파이썬에서 사용하는 메소드 형식

1. 인스턴스 메소드

2. 정적 메소드

3. 클래스 메소드

 

정적(static) 메소드 활용

인스턴스 없이 사용할 수 있는 메소드, '@staticmethod'를 메소드 위에 작성. self 매개변수를 사용하지 않는다.

 

형식)

 class 클래스명:

         @staticmethod

         def 메소드명(매개변수목록):

               실행문장....

 

특성)

인스턴스/클래스 속성을 사용(접근)하거나, 인스턴스/클래스 메소드 사용이 불가하다.

 

class MyCal:
    @staticmethod
    def add(a, b):
        print(f'{a} + {b} = {a + b}')
        
    @staticmethod
    def sub(a, b):
        print(f'{a} - {b} = {a - b}')
        
MyCal.add(5, 7)
MyCal.sub(10, 5)

 

클래스 메소드 활용

인스턴스 없이 사용할 수 있는 메소드

메소드의 첫 번째 매개변수는 'cls', cls는 클래스가 통째로 넘어오는 변수, 인스턴스 속성/메소드 사용 불가.

대신, 클래스 속성/메소드 사용 가능

'@classmethod'를 메소드 위에 작성.

 

class 클래스명:

         val = ''

 

         @classmethod

         def 메소드명(cls, 매개변수목록):

               cls.val 형식으로 사용

               cls.메소드명()

               수행문장들....

 

class MyCal:
    @staticmethod
    def add(a, b):
        print(f'{a} + {b} = {a + b}')
        
    @staticmethod
    def sub(a, b):
        print(f'{a} - {b} = {a - b}')
        
MyCal.add(5, 7)
MyCal.sub(10, 5)

static, class 메소드 차이점 : 데코레이터, cls 식별자 이름

자바스크립트나 파이썬에서는 클래스를 어떻게 사용할 지 생각해 보는 것이 필요.

 

클래스 상속(파생)

기반 클래스(메인, 부모)로 부터 파생된 새로운 클래스를 작성할 수 있음.

형식) 

      class 기반클래스:

               이런저런 코드들....

 

      class 파생클래스(기반클래스):

               또다른코드들....

# 기반클래스
class PersonInfo:
    def intro(self):
        print('사람입니다.')
        
# 파생클래스        
class StudentInfo(PersonInfo):
    def working(self):
        print('공부하자')
        
std1 = StudentInfo()
std1.intro()
std1.working()

파이썬은 다중 클래스를 사용하여 하나의 클래스를 파생시킬 수 있다.

class 파생클래스(기반클래스1, 기반클래스2, .....):

        ......

 

# 기반클래스
from typing import Any


class PersonInfo:
    def __init__(self):
        self.naem = ""
        self.age = 0
    
    def intro(self):
        print('사람입니다.')
        
class ManInfo:
    def gender(self):
        print('남성입니다.')        
        
# 파생클래스        
class StudentInfo(PersonInfo, ManInfo):
    def __init__(self):
        self.school = ""
    
    def working(self):
        print('공부하자')
        
    def intro(self):
        super().intro() # 둘 다 사용하기
        print('학생입니다.') # 덮어씌워짐
        

std1 = StudentInfo()
std1.intro()
std1.working()
std1.gender()

추상클래스 (= 자바의 interface와 유사)

메소드의 목록만 가진 클래스, 상속받은 파생 클래스에서 메소드 구현을 강제함.

abc(Abstract Base Class) 모듈을 import 해야함

클래스이름 옆에 '(metaclass=ABCMeta)'를 작성. 메소드 이름 위에 '@abstractmethod'를 작성.

메소드의 코드는 'pass'로 작성

from abc import *

class Animal(metaclass=ABCMeta):
    @abstractmethod
    def haul(self):
        pass
    
class Dog(Animal):
   #pass
    def haul(self):
       print('멍멍')
        
d1 = Dog()
d1.haul()

 

TypeError: Can't instantiate abstract class Dog with abstract method haul

TypeError: Can't instantiate abstract class Dog with abstract method eat

 

 

패키지 설치 

고급 시스템 설정 보기 - 환경변수 - 시스템 - path - 편집 - 환경변수편집 - 

C:\Users\user\AppData\Local\Programs\Python\Python311\Scripts

 

 

터미널 - pip

> pip install 패키지

requests 패키지 설치 : 인터넷 요청과 응답 처리용 패키지

ovencv-python 패키지 설치

 

# 파일 불러오기 (같은 폴더 내, 아니면 경로 지정)
import cv2

print(cv2.__version__)

img = cv2.imread('M:/Raspberry-work/python/day04/aaa.jpg')
img1 = cv2.resize(img, (300,240))

cv2.imshow('image', img1)
cv2.waitKey(0)
cv2.destroyAllWindows()

# 페이지 번호
import requests

r = requests.get('http://www.google.co.kr/ttt')
print(r.status_code)

 

'공부기록 > Python' 카테고리의 다른 글

6월 14일 (2) python - Web  (0) 2023.06.14
6월 14일 (1) python - 예외처리, 패키지  (0) 2023.06.14
6월 12일 (2) python - 모듈  (0) 2023.06.12
6월 12일 (1) python - 함수  (1) 2023.06.12
6월 9일 (2) python - 제어문2  (0) 2023.06.09