# class
- self, 클래스, 인스턴스 변수
- 클래스(객체), 인스턴스 차이 중요
- 네임스페이스 : 각각의 객체를 인스턴스화 할 때 저장된 독립적 공간, 파이썬의 모든 자료형은 네임스페이스 가지고 있음.
- 클래스 변수 : 직접 사용 가능, 객체보다 먼저 생성
- 인스턴스 변수 : 객체마다 별도로 존재, 인스턴스 생성 후 사용
# (1)
class A: (
(
pass (
class UserInfo:
def __init__(self, name): (
self.name = name
def user_info_p(self):
print("NAME : ", self.name)
네임스페이스 -> 인스턴스화 된 변수( ex) user1)가 갖고 있는 자기 자신의 공간 , user1= user2
user1 = UserInfo("Kim") (
print(user1.name)
user1.user_info_p()
user2 = UserInfo("Park")
print(user2.name)
user2.user_info_p()
user1 id값과 user2 id 값이 다른 것을 알 수 있음
print(id(user1))
print(id(user2))
namespace 출력
print(user1.__dict__)
print(user2.__dict__)
# (2)
- self 이해
- 인스턴스 생성하는 메소드는 self인자가 자동으로 넘어간다 ~!
- self가 없는 것들은 class에서 직접 호출한다~!
class SelfTest():
def function1():
print('function1 called~!')
def function2(self):
print('function2 called~!')
print(id(self))
self_test = SelfTest()
SelfTest.function1()
self_test.function2()
2204931183136
print(id(self_test))
SelfTest.function2(self_test)
# (3)
- 클래스 변수(self 없음), 인스턴스 변수(self)
class WareHouse:
stock_num = 0
def __init__(self, name):
self.name = name
WareHouse.stock_num += 1
def __del__(self):
WareHouse.stock_num -= 1
user1 = WareHouse('Kim')
user2 = WareHouse('Park')
user3 = WareHouse('Lee')
print(user1.__dict__)
print(user2.__dict__)
print(user3.__dict__)
print(WareHouse.__dict__)
print(user1.name)
print(user2.name)
print(user3.name)
print(user1.stock_num)
print(user2.stock_num)
print(user3.stock_num)
del user1
print(user2.stock_num)
print(user3.stock_num)
# class 상속, 다중상속
# (1)
- 상속 기본
- 슈퍼클래스(부모) 및 서브클래스(자식) -> 모든 속성과 메소드를 사용 가능.
- 라면 -> 속성(종류, 회사, 맛, 면종류, 이름) : 부모 ( 공통으로 사용할 수 있는 속성 )
class Car:
"""Parent Class"""
def __init__(self, tp, color):
self.type = tp
self.color = color
def show(self):
return 'Car Class "Show Method!"'
class BmwCar(Car):
"""Sud Class"""
def __init__(self, car_name, tp, color):
super().__init__(tp, color)
self.car_name = car_name
def show_model(self) -> None:
return "Your Car Name :%s" % self.car_name
class BenzCar(Car):
"""Sud Class"""
def __init__(self, car_name, tp, color):
super().__init__(tp, color)
self.car_name = car_name
def show_model(self) -> None:
return "Your Car Name :%s" % self.car_name
def show(self):
print(super().show())
return 'Car Info : %s %s %s ' % (self.car_name, self.type, self.color)
일반 사용
model1 = BmwCar('520d', 'sedan','red')
print(model1.color)
print(model1.type)
print(model1.car_name) /
print(model1.show())
print(model1.show_model())
print(model1.__dict__)
Method Overriding (오버라이딩) -> 알아야 다른 개발자의 소스 , 오픈소스 , 기존 패키지 안에있는 모듈 소스 들을 분석가능
model2 = BenzCar("220d", "suv", "black")
print(model2.show())
Parent Method Call
model3 = BenzCar("350s", "sedan", "silver")
print(model3.show())
Inheritance Info
print(BmwCar.mro())
print(BenzCar.mro())
# (2)
- 다중 상속
- 너무나 복잡한 다중상속은 코드를 해석하기가 어려울 수 있음. 보통은 2개 정도 상속받음.
class X():
pass
class Y():
pass
class Z():
pass
class A(X, Y):
pass
class B(Y, Z):
pass
class M(B, A, Z):
pass
print(M.mro())
print(A.mro())