클래스 : 자바의 클래스와 같은 개념
작성법)
클래스는 '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 |