Skip to content

Latest commit

 

History

History
134 lines (96 loc) · 3.74 KB

2022.07.18.md

File metadata and controls

134 lines (96 loc) · 3.74 KB

데코레이터를 이용한 캡슐화


단순히 getter, setter 메소드를 만들고 싶다면

class User:
    def __init__(self, name, age, password):
        self.name = name
        self.age = age
        self._password = password

    def get_password(self):
        return self._password

    def set_password(self, value):
        self._password = value

user1 = User("홍길동", 22, "1234")
user1.name = "홍길순"
user1.age = 23
user1.set_password("3333")

print(user1.name)
print(user1.age)
print(user1.get_password)

이런 식으로 작성하면 된다.

하지만 문제는 위의 코드에서 age 를 캡슐화하고 싶어졌을 때이다. 위의 코드에는 age 를 get 또는 set 하는 코드가 얼마 없고 찾기가 쉽지만 만약 실무라면 한 변수가 얼마나 많은 곳에서 get되고 set되고 있겠는가?

따라서 데코레이터 함수를 사용해 다른 곳 모두에서 일일히 바꿔줄 필요 없이 캡슐화를 시킬 수 있다.

class User:
    def __init__(self, name, age, password):
        self.name = name
        self._age = age
        self._password = password

    @property
    def age(self):
        return self._age

    @age.setter
    def age(self, value):
        self._age = value 

    def get_password(self):
        return self._password

    def set_password(self, value):
        self._password = value

user1 = User("홍길동", 22, "1234")
user1.name = "홍길순"
user1.age = 23
user1.set_password("3333")

print(user1.name)
print(user1.age)
print(user1.get_password)

클래스 내에서 데코레이터 함수와 함께 getter, setter 메소드를 만들면 클래스 외부의 코드를 변경하지 않고도 그대로 캡슐화 한 채 사용할 수 있다.

상속


부모로부터 물려받기


부모로부터 상속된 자식 클래스는 부모 클래스의 모든 속성과 메소드를 물려받는다. 그 방법은 아래와 같다.

class Parent:
    def __init__(self, x, y):
        self.x = x
        self.y = y
    
    def adder(self):
        return self.x + self.y

class Child(Parent):
    def divider(self):
        return self.x / self.y

nums1 = Child(1, 3)
print(nums1.adder())

상속과 관련된 메소드와 함수


mro 메소드 (method resolution order)

해당 클래스의 부모 클래스들을 자식->부모의 방향으로 볼 수 있다. 특히 이 순서가 인스턴스의 메소드를 호출 했을 때 찾는 순서이다.

isinstance 메소드

해당 요소가 파라미터로 받은 클래스의 인스턴스인지 아닌지를 불린 값으로 반환하는 메소드이다.

이 때, 자식 클래스로 만든 인스턴스는 부모 클래스에 대해서도 True 즉, 부모 클래스의 인스턴스가 맞다는 점을 기억하자.

issubclass 함수

한 클래스가 다른 클래스의 자식 클래스인지를 알려주는 함수이다.

issubclass(test, criterion)

첫 번째 파라미터가 검사할 클래스, 두 번째 파라미터가 기준이 되는 클래스이다.

여기서 중요한 점은 바로 위 아래 상속 관계가 아니라 자식의 자식의 자식 처럼 상속 관계이기만 하면 True 라는 것이다.

오버라이딩


기반 클래스의 메서드를 무시하고 새로운 메서드를 만든다는 뜻이다.

보통 프로그램에서 어떤 기능이 같은 메소드 이름으로 계속 사용되어야 할 때(던더 init 등) 사용한다.

이 때 super() 함수를 사용해 부모 클래스의 기능을 재활용하며 새로운 것만 덧붙일 수도 있다.

super().__init__(name, age, password)
...

참고로 super()을 사용 시 파라미터로 self는 쓰지 않는 것이 원칙이다.