[데이터분석]파이썬 스터디노트 6

bin·2023년 2월 9일
0

파이썬

목록 보기
6/12
post-thumbnail

객체와 메모리

  • 객체는 클래스로부터 생성자를 호출해서 메모리에 생성
  • 변수에 직접 객체 저장되는 것이 아니라, 객체의 메모리주소가 저장됨->
    이를 통해 객체 참조(기능 호출/속성 변경)
class Robot:
    def __init__(self, color, height, weight):
        self.color = color
        self.height = height
        self.weight = weight

    def printRobotInfo(self):
        print(f'color: {self.color}')
        print(f'height: {self.height}')
        print(f'weight: {self.weight}')

rb1 = Robot('red', 200, 80)  #객체 생성하여 레퍼런스변수에 담음
rb1.printRobotInfo()   #rb1에 담긴 주소값으로 가서 기능 호출
rb2 = Robot('blue', 300, 120)
rb3 = rb1
rb3.printRobotInfo()  #rb1에 있는 메모리주소가 카피
  • rb1과 rb2는 다른 객체이지만(얕은 복사), rb3과 rb1은 같은 객체 공유(깊은 복사) -> rb1로 속성 변경하면 rb3에서도 수정

🔔 연습문제

scores = [int(input('국어 점수 입력: ')),
         int(input('영어 점수 입력: ')),
         int(input('수학 점수 입력: '))]

print(scores)

copyScores = scores.copy()

for idx, score in enumerate(copyScores):
    result = score * 1.1
    copyScores[idx] = 100 if result > 100 else result


print(f'이전 평균: {sum(scores) / len(scores)}')
print(f'이후 평균: {sum(copyScores) / len(copyScores)}')

💥enumerate() 리스트 인덱스와 값을 출력할 수 있는 함수 (결과값은 튜플)

a = ['a','b','c','d']
for i in enumerate(a):
    print(i)

(인덱스, 값)
(0, 'a')
(1, 'b')
(2, 'c')
(3, 'd')

a = ['a','b','c','d']
for idx, name in enumerate(a):
    print(f'{idx}번째 이름은 {name}입니다')

0번째 이름은 a입니다
1번째 이름은 b입니다
2번째 이름은 c입니다
3번째 이름은 d입니다

얕은 복사와 깊은 복사

  • 얕은 복사: 객체 주소 복사, 객체 자체가 복사되지는 X
tc1 = TemCls(10, 'Hello')
tc2 = tc1
tc1.printClsInfo()
tc2.printClsInfo()

-> 같은 값 나옴 / tc1로 접근해서 속성 변경하면 tc2도 변경

scores = [9,8,7,6,5,4,3]
scoresCopy = []

scoresCopy=scores
print(f'id(score): {id(scores)}')
print(f'id(scoresCopy): {id(scoresCopy)}')
  • 깊은 복사: 객체 자체 복사, 또 하나의 객체가 만들어짐
  1. copy() 활용
import copy
tc1 = TempCls(10, 'Hello')
tc2 = copy.copy(tc1)
  1. for문 활용
scores = [9,8,7,6,5,4]
scoresCopy = []

for s in scores:
    scoresCopy.append(s)

print(f'id(score): {id(scores)}')
print(f'id(scoresCopy): {id(scoresCopy)}')
  1. extend() 활용
scores = [9,8,7,6,5,4]
scoresCopy = []

scoresCopy.extend(scores)

print(f'id(score): {id(scores)}')
print(f'id(scoresCopy): {id(scoresCopy)}')
  1. 슬라이싱기능 활용
scores = [9,8,7,6,5,4]
scoresCopy = scores[:]  #슬라이싱
print(f'id(score): {id(scores)}')
print(f'id(scoresCopy): {id(scoresCopy)}')

🔔 연습문제
Q. 선수 점수에 대한 총합 / 평균 내고, 복사본 만들어서 최대값, 최소값 점수 제외한 총합 / 평균 내기

plaOriSco = [8,7,6,8,9,10,5]
plaCopSco = plaOriSco.copy()

plaOriSco.sort()

plaCopSco.sort()
plaCopSco.pop(0)
plaCopSco.pop()

print(f'plaOriSco: {plaOriSco}')
print(f'plaCopSco: {plaCopSco}')

oriTot = round(sum(plaOriSco), 2)
oriAvg = round(sum(plaOriSco)/len(plaOriSco),2)
print(f'Original Total: {oriTot}')
print(f'Original Average: {oriAvg}')

copTot = round(sum(plaCopSco), 2)
copAvg = round(sum(plaCopSco)/len(plaCopSco),2)
print(f'Copy Total: {copTot}')
print(f'Copy Average: {copAvg}')

클래스 상속
상속: 다른 클래스의 기능을 내 것처럼 사용

class NormalCar:
    def drive(self):
        print('[NormalCar] drive() called!!')

    def back(self):
        print('[NormalCar] back() called!!')

class TurboCar(NormalCar):
    def turbo(self):
        print('[TurboCar] turbo() called!!')

myTurboCar = TurboCar()
myTurboCar.turbo()
myTurboCar.drive()
myTurboCar.back()

TurboCar는 NormalCar가 가진 drive, back 기능 모두 사용 가능

생성자
객체가 생성될 때 생성자를 호출하면 init()가 자동 호출

__init__() : 속성을 초기화
생성자 호출할 때 입력한 매개변수가 init 안으로 들어가며 속성 초기화
1. 외부에서 매개변수 받아서

class Calculator:
    def __init__(self, n1, n2):
        print('[Calculator] __init__() called!!')
        self.num1 = n1
        self.num2 = n2

cal = Calculator(10, 20)
print(f'Calculator.num1: {cal.num1}')
  1. 매개변수 없이 고정
class Calculator:
    def __init__(self):
        print('[Calculator] __init__() called!!')
        self.num1 = 10
        self.num2 = 20

cal = Calculator()
print(f'Calculator.num1: {cal.num1}')

super(): 상위클래스 초기화

class P_Class:

    def __init__(self, pNum1, pNum2):
        print('[P_Class] __intit__() called!!')
        self.pNum1 = pNum1
        self.pNum2 = pNum2


class C_Class(P_Class):

    def __init__(self, cNum1, cNum2):
        print('[C_Class] __init__() called!!')
        self.cNum1 = cNum1
        self.cNum2 = cNum2

cls = C_Class(10,20)

출력값: [C_Class] init() called!!
= P_Class의 속성값은 초기화되지 않았다

💥 상위클래스 초기화 하는 방법
1. 강제 호출

class C_Class(P_Class):

    def __init__(self, cNum1, cNum2):
        print('[C_Class] __init__() called!!')

        P_Class.__init__(self, cNum1, cNum2)
        
        self.cNum1 = cNum1
        self.cNum2 = cNum2
  1. super() 활용 (좀 더 세련된 방법)
class C_Class(P_Class):

    def __init__(self, cNum1, cNum2):
        print('[C_Class] __init__() called!!')

        super().__init__(cNum1, cNum2)

        self.cNum1 = cNum1
        self.cNum2 = cNum2

🔔 연습문제
중간고사 클래스와 기말고사 클래스를 상속관계로 만들고 각각의 점수 초기화
+총점 및 평균을 반환하는 기능

class MidExam:
    def __init__(self, s1, s2, s3):
        print('[MidExam] __init__()')  #호출된 것을 알기 위해

        self.mid_kor_score = s1
        self.mid_eng_score = s2
        self.mid_mat_score = s3

    def printScores(self):
        print(f'mid_kor_score: {self.mid_kor_score}')
        print(f'mid_eng_score: {self.mid_eng_score}')
        print(f'mid_mat_score: {self.mid_mat_score}')

class EndExam(MidExam):
    def __init__(self,s1,s2,s3,s4,s5,s6):
        print('[EndExam] __init__()')

        super().__init__(s1,s2,s3)

        self.end_kor_score = s4
        self.end_eng_score = s5
        self.end_mat_score = s6

    def printScores(self):
        super().printScores()
        print(f'end_kor_score: {self.end_kor_score}')
        print(f'end_eng_score: {self.end_eng_score}')
        print(f'end_mat_score: {self.end_mat_score}')

    def getTotal(self):
        total = self.mid_kor_score + self.mid_eng_score + self.mid_mat_score
        total += self.end_kor_score + self.end_eng_score + self.end_mat_score

        return total

    def getAvg(self):
        return self.getTotal() / 6

exam = EndExam(56,62,76,88,35,21)
exam.printScores()

print(f'Total: {exam.getTotal()}')
print(f'Average: {exam.getAvg()}')

속성 초기화
기능 초기화
💥 return self.getTotal

오버라이딩 하위 클래스에서 상위 클래스의 메서드를 재정의(override)

추상클래스 상위클래스에서 하위클래스에 매서드 구현 강요
메서드 선언만 하고 구현은 하위 클래스에서 서술

from abc import ABCMeta
from abc import abstractmethod
  1. abc 패키지로부터 ABCMeta, abstractmethod 가져오기

  2. class AirPlane(metaclass=ABCMeta):

  3. @abstractmethod
    -> 여러 하위클래스가 상속할 경우, 공통적인 기능을 각 클래스마다 달리 구현 필요할 때 사용

0개의 댓글