단순히 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())
해당 클래스의 부모 클래스들을 자식->부모의 방향으로 볼 수 있다. 특히 이 순서가 인스턴스의 메소드를 호출 했을 때 찾는 순서이다.
해당 요소가 파라미터로 받은 클래스의 인스턴스인지 아닌지를 불린 값으로 반환하는 메소드이다.
이 때, 자식 클래스로 만든 인스턴스는 부모 클래스에 대해서도 True 즉, 부모 클래스의 인스턴스가 맞다는 점을 기억하자.
한 클래스가 다른 클래스의 자식 클래스인지를 알려주는 함수이다.
issubclass(test, criterion)
첫 번째 파라미터가 검사할 클래스, 두 번째 파라미터가 기준이 되는 클래스이다.
여기서 중요한 점은 바로 위 아래 상속 관계가 아니라 자식의 자식의 자식 처럼 상속 관계이기만 하면 True 라는 것이다.
기반 클래스의 메서드를 무시하고 새로운 메서드를 만든다는 뜻이다.
보통 프로그램에서 어떤 기능이 같은 메소드 이름으로 계속 사용되어야 할 때(던더 init 등) 사용한다.
이 때 super() 함수를 사용해 부모 클래스의 기능을 재활용하며 새로운 것만 덧붙일 수도 있다.
super().__init__(name, age, password)
...
참고로 super()을 사용 시 파라미터로 self는 쓰지 않는 것이 원칙이다.