본문 바로가기
학부 자료/Python

[Python] 파이썬 기초 13/20, 클래스와 객체

by jackMK 2023. 11. 7.

<내용정리>


- 관련 파일

13일차_221214.py
0.00MB


- 본문

# 섹션14 p254 예제1
while True:
    filename = input('복사할 파일명을 입력하세요 >>>')
    extname = filename[filename.rfind('.') + 1:]  # 확장자를 추출
    if extname != 'txt':
        print('복사할 수 없는 파일입니다')
    else:
        break
with open(filename, 'rt') as source:
    with open('복사본-' + filename, 'wt') as copy:
        while True:
            buffer = source.read(1)  # 1바이트씩 읽어 buffer에 담는다
            if not buffer:
                break
            copy.write(buffer)
print(f'복사본-{filename}파일이 생성되었습니다.')

# 예제2
import csv
with open('Section14/cctv.csv', 'r') as csvfile:
    buffer = csv.reader(csvfile, delimiter=',', quotechar='"')
    totalcctv = 0  # cctv 개수
    for i, line in enumerate(buffer):
        if i != 0:  # 제목 줄이 아니라면
            totalcctv += int(line[4])
print(f'대구광역시 달서구에 설치된 cctv는 총 {totalcctv}대입니다')

# 예제3
import json
with open('Section14/cctv.json', 'r', encoding='utf-8') as jsonfile:
    buffer = jsonfile.read()
    cctv_list = json.loads(buffer)  # 파이썬으로 변환
    cctv_purpose = set()  # 결과를 담을 빈 set 생성
    for place in cctv_list:
        cctv_purpose.add(place['설치목적구분'])  # set에 추가
print(cctv_purpose)

# p267 예제
class Computer:
    def set_spec(self, cpu, ram, vga, ssd):
        self.cpu = cpu
        self.ram = ram
        self.vga = vga
        self.ssd = ssd
    def hardware_info(self):
        print(f'CPU = {self.cpu}')
        print(f'RAM = {self.ram}')
        print(f'VGA = {self.vga}')
        print(f'SSD = {self.ssd}')
desktop = Computer()
desktop.set_spec('i7', '16GB', 'GTX1060', '512GB')
desktop.hardware_info()
print()
notebook = Computer()
notebook.set_spec('i5', '8GB', 'MX300', '256GB')
notebook.hardware_info()

# p269 예제
class Calculator:
    def input_expr(self):
        expr = input('수식을 입력하세요 >>> ')
        self.expr = expr
    def calculate(self):
        return eval(self.expr)  # eval : 문자열로 입력 받은 수식을 계산
calc = Calculator()
calc.input_expr()
print(f'{calc.calculate()}')

### 섹션16 클래스와 객체2
## 생성자와 소멸자
# 생성자
객체에서 초깃값을 설정해야 할 필요가 있을 때 사용
객체가 생성될 떄 자동으로 호출해주는 메서드
__init__ 사용

스페셜메서드(매직메서드) : 파이썬에서 자동을 호출해주는 메서드
                        앞뒤로 __가 붙은 메서드
<형식>
class 클래스이름:
    def __init__(self):
        self.속성 = 값

# ex)
class Candy1:
    def set_info(self, shape, color):
        self.shape = shape
        self.color = color
candy1 = Candy1()
candy1.set_info('circle', 'yellow')
print(candy1.shape, candy1.color, sep=', ')

# ex) 생성자 사용
class Candy2:
    def __init__(self, shape, color):
        self.shape = shape
        self.color = color
candy2 = Candy2('circle', 'blue')
print(candy2.shape, candy2.color, sep=', ')

# p276
class USB:
    def __init__(self, capacity):
        self.capacity = capacity
    def info(self):
        print(f'{self.capacity}GB USB')
usb = USB(256)  # 인스턴스 생성
usb.info()  # 인스턴스 메서드 호출

# p277
class Service:
    def __init__(self, service):
        self.service = service
        print(f'{self.service} Service가 시작되었습니다')
    def __del__(self):
        print(f'{self.service} Service가 종료되었습니다')
sv = Service('네비게이션')
del sv

## 클래스 변수
클래스 안에서 공간이 할당된 변수
여러 인스턴스 안에서 클래스 변수 공간을 함께 사용

# ex)
class Car:
    count = 0
    def __init__(self, name, speed):
        self.name = name
        self.speed = speed
        Car.count += 1  # 클래스 변수에 1씩 증가
my = Car('sonata', 0)
print(f'{my.name}의 현재 속도는 {my.speed}km, 생산된 자동차 수 {Car.count}대')
you = Car('santafe', 30)
print(f'{you.name}의 현재 속도는 {you.speed}km, 생산된 자동차 수 {Car.count}대')

## 클래스 메서드
1. 인스턴스 또는 클래스로 호출
2. 생선된 인스턴스가 없어도 호출 가능**
3. @classmethod 데코레이터를 표시하고 작성
4. 매개변수 self를 사용하지 않고 cls를 사용

# ex)
class Korean:
    country = '한국'
    @classmethod
    def trip(cls, country):
        if cls.country == country:
            print('국내여행!')
        else:
            print('해외여행!')
Korean.trip('한국')  # 객체없이 호출 가능
Korean.trip('미국')

# p270 1
class Book:
    def set_info(self, title, author):
        self.title = title
        self.author = author
    def print_info(self):
        print(f'책 제목: {self.title}')
        print(f'책 저자: {self.author}')
book1 = Book()
book2 = Book()
book1.set_info('파이썬', '민경태')
book2.set_info('어린왕자', '생텍쥐페리')
book_list = [book1, book2]
for book in book_list:
    book.print_info()

loading