파이썬 -상속 및 함수

2024. 12. 1. 20:39파이썬(python) 강의 메모 및 실습

1. 상속

# 상속
# 상속이라는 것은 상위 개념을 적용받은 하위 개념을 만들 때
# 사용하는 것이다.(하향식)
# 상속을 하는 클래스는 부모 클래스라고 부르며,
# 상속을 함으로써 상속받는 자식 클래스는
# 부모 클래스가 정의한 속성, 메서드 등등을
# 그대로 (재)사용할 수 있게 된다.

# 혹은 상속받은 것을 수정하거나
# 자식 클래스만의 새로운 무언가를 추가할 수도 있다.

# 부모 클래스, 슈퍼 클래스, 상위 클래스
# 상위 클래스를 먼저 만들고 하위 클래스를 만드는 것을
# 하향식 클래스 작성이라고 부른다.
# 이런 방식은 기초 개념(공통 개념)을 정립한 후
# 구체적인 개념을 추가하는 방식에서 주로 쓰인다.
class Person:
    def __init__(self, name) -> None:
        self.name = name
        pass

    def walk(self, floor:str):
        """
        floor: 어디를 걷고 있는 설명해보자.
        """
        print(f"{self.name}이(가) {floor} 위로 걸어갑니다.")

# 자식 클래스, 서브 클래스, 하위 클래스
# 부모 클래스로부터 속성, 메서드(init 제외)를 그대로 가져와서
# 사용할 수 있는 클래스를 말한다.
# 부모 클래스로부터 상속받은 정보를 수정해서 사용하거나
# 새로운 자신만의 속성이나 기능(메서드)을 추가할 수 있다.
# 상속받은 내용은 재작성할 필요가 없기 때문에
# 개발시간을 단축할 수 있다(생산성 향상)

# 같은 부모 클래스를 상속받은 자식 클래스들은
# 부모 클래스가 정의한 메서드를 모두 가지고 있기 때문에
# 일괄적인, 일관적인 관리와 사용이 가능하다.
class Male(Person):
    def __init__(self, name) -> None:
        # super().__init__(name)
        self.name = name
    
    def walk(self, floor: str):
        # return super().walk(floor)
        # 재정의(override)
        # 부모 클래스에 정의된 메서드를
        # 가리고 스스로가 만든 내용으로 변경하는 것
        print(f"{self.name} 님이 {floor} 위로 걸어갑니다.")

class Female(Person):
    def __init__(self, name) -> None:
        super().__init__(name)
    
    def walk(self, floor: str):
        # return super().walk(floor)
        print(f"{self.name}씨가 {floor}로 된 복도를 걸어갑니다.")

if __name__ == "__main__":
    # m = Male("홍길동")
    # f = Female("홍순자")
    # people: list[Person] = [m, f]
    # 다형성
    # 자식 클래스가 부모 클래스로부터 상속받음으로써
    # 속성과 메서드 뿐만 아니라 부모 클래스라는 "타입"도
    # 상속 받는다.
    # for p in people:
    #     print(p.name)
    #     p.walk("대리석")

    # 원시 타입과 참조 타입
    # 원시타입은 값 그 자체가 들어가 있는 저장공간을 의미한다.
    # 변수에 원시타입의 값을 담아서 다른 변수에 담으면
    # 값만 복사된다.
    num = 3
    num2 = num + 5 # 8
    num += 2    # num == 5
    print(num2) # 8
    # 기존 num을 사용한 것에 대해서
    # 이후에 num의 값을 바꿔도
    # 이전 연산에 영향을 주지 않는다.

    # 참조 타입(클래스)
    # 참조 타입은 값이 위치한 주소값을 담고 있기 때문에
    # 다른 변수에 대입하면 값이 아니라 주소값을 전달한다.
    # 이때 주소값을 가진다는 것은 "참조한다"라고 표현하며
    # 참조 대상이 같은 경우(주소값이 같다면)
    # 같은 대상을 바라보고 있는 것이기 때문에
    # 같은 주소값을 가졌다면 같은 값에 접근할 수 있다.
    철수네집 = Person("철수")
    철수엄마네집 = 철수네집

    # 주소값이 같은지 확인
    print(f"철수네집: {철수네집}")
    print(f"철수엄마네집: {철수엄마네집}")
    print("=============")
    철수네집.name = "홍길동"
    print(f"철수name:\n{철수네집.name}\n")
    print(f"철수엄마name:\n{철수엄마네집.name}")
  
 -->
#8
#철수네집: <__main__.Person object at 0x0000022FD6AF9D50>
#철수엄마네집: <__main__.Person object at 0x0000022FD6AF9D50>
=============
#철수name:
#홍길동

#철수엄마name:
#홍길동

 

2. 이터레이터

# 이터레이터
# 반복 가능한 객체, 즉 이터러블 객체에 대해서
# 그 요소를 순차적으로 하나씩 반환 할 수 있는
# 객체를 의미한다.
# 한번에 하나의 요소에 접근하여
# 메모리 효율적이다.




if __name__ == "__main__":
    nums = [e for e in range(3)]
    iter_nums = iter(nums)
    # print(next(iter_nums))
    # print(next(iter_nums)*2)
    # print(next(iter_nums)*3)

    # 기존 값의 길이를 활용하여 반복
    #iterator 객체는 len()함수에 넣을 수 없다.
    # for i in range(len(nums)):
    #     print(next(iter_nums))
    
    # enumerate()
    # 전달된 이터러블 객체의 각 요소에 인덱스를 부여해서
    # (index,element)와 같은 방식으로 tuple 자료형의 값을
    # #반환하는 함수이다.
    nums = [e*3 for e in range(4)]
    # for i, e in enumerate(nums):
    #     print(f"{i:2d}. {e:2d}")       

    for enum in enumerate(nums):
        print(type(enum))
   -->
<class 'tuple'>
<class 'tuple'>
<class 'tuple'>
<class 'tuple'>

 

3. 함수 길이

class Num:
    def __init__(self, value) -> None:
        self.value = value
    
    # __str__(self)
    # 출력했을 때 나오는 값을 설정하는 매직 메서드
    def __str__(self) -> str:
        # 해당 클래스 타입을 가지고 있는지 확인하는 함수
        if isinstance(self.value, Num):
            return str(self.value.value)
        else:
            return str(self.value)
    
    def __add__(self, other):
        print(self.value)
        print(other.value)
        return self.value + (other.value if isinstance(other, Num) else other)
    
    def __len__(self):
        return len(str(self.value))
    
if __name__ == "__main__":
    n = Num(30)
    n2 = Num(15)
    # print(str(n)) # 30
    # print(n)      # 30
    
    print(n + n2)
    print(len(n))
    # print(len(312)) #숫자의 길이는 할수 없음
 -->
#30
#15
#45
#2

 

4. unpacking

# unpacking
# 메서드에서 값을 반환할때,
# 여라개의 값을 반환하면
# tuple 형태로 packing하여 반환된다.
# 이때, 메서드를 사용한 쪽에서
# 변수에 담으려고 할때, 반환된 튜플 요소의 개수가
# 담으려는 변수의 개수와 동일하다면 ->다르면 오류
# 순서에 맞게 값이 변수에 각가 담긴다.


def split_name(name:str, len_lastname:int=1):
    last_name = name[0:1] # 성 부분
    first_name = name[1:] #이름 부분
    return last_name, first_name

if __name__ == "__main__":
    print(split_name("홍길동"))      # ('홍', '길동')
    print(split_name("남궁길동", 2))  # ('남', '궁길동')


def split_name(name:str, len_lastname:int=1):
    last_name = name[0:len_lastname] # 성 부분
    first_name = name[len_lastname:] #이름 부분
    return last_name, first_name

if __name__ == "__main__":
    성, 이름 = split_name("남궁길동", 2)   
    print(f"성:{성}, 이름:{이름}")   # 성:남궁, 이름:길동
728x90
LIST

'파이썬(python) 강의 메모 및 실습' 카테고리의 다른 글

파이썬 클래스와 메서드  (2) 2024.12.01
파이썬-함수  (0) 2024.12.01
파이썬 반복문과 리스트  (0) 2024.12.01
파이썬 제어문_조건문  (0) 2024.12.01
파이썬 형변환  (0) 2024.12.01