Python] Class

파이썬의 클래스와 Java의 클래스를 비교해가면서 알아보자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Test:
__num = 5
def __init__(self):
pass

def get_num(self):
return self.__num

def set_num(self, num):
self.__num = num


test = Test()
print(test.get_num()) #5
#print(test.__num) #AttributeError: 'Test' object has no attribute '__num'

위의 파이썬 소스는 아래의 Java 소스와 같다

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class Test {
private int num = 5;

public Test() {}

public int getNum() {
return num;
}

public void setNum(int num) {
this.num = num;
}
}

class TestMain {
public static void main(String[] args) {
Test test = new Test();
System.out.println(test.getNum()); //5
// System.out.println(test.num); //컴파일 에러 - num has private access
}
}

파이썬 class의 유연성

1
2
3
4
test.test = "테스트"
print(test.test) #테스트
test.f = lambda : print("함수 확인")
test.f() #함수 확인

사용해야할 때는 위와 같이 사용하고 난 후, 지워야할 때는 del을 이용해서 지워주면 된다.

클래스 상속 type

1
2
3
print(type(test)) #<class '__main__.Test'>
print(type(Test)) #<class 'type'>
print(type(int)) #<class 'type'>

인스턴스는 클래스를 상속 받고, 클래스는 type을 상속 받는다.

그러면 type이 최상위일까 생각을 하였는데 type 코드를 보면 class type(object):으로 쓰여져 있는 것을 볼 수 있다. 최상위 객체는 object이다.

Override

파이썬에서 오버라이딩은 Annotation이 필요없다.

Overloading

파이썬은 오버로딩을 지원하지 않는다.

사용하기 위해서는 별도의 라이브러리를 써야한다.

1
2
3
4
5
6
class A:
def first(self, f=None):
if f is not None:
print 'first met', f
else:
print 'first method'

위와 같이 하는 것도 하나의 방도이다.

Pratice

클래스에 대해서 이해하기 위해 실습을 하나 진행

자바에서 공부했던 클래스를 파이썬으로 구현해보자.

https://github.com/TaeJuneJoung/Java/tree/master/src/Chater5

Customer과 VIPCustomer을 구현해보자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
class Customer:

__cutomerID = 10000
__customerName = None
__customerGrade = None
__bonusPoint = 0
__bonusRatio = 0.0

""" Constructor """
def __init__(self):
self.setCustomerGrade("SILVER")
self.setbonusRatio(0.01)
self.setCustomerID(self.getCustomerID() + 10)

""" Method """
def calcPricer(self, price):
self.__bonusPoint += int(price * self.__bonusRatio)
return price

def showCustomerInfo(self):
return f'{self.getCustomerName()}님의 등급은 {self.getCustomerGrade()}이며, 적립된 보너스 포인트는 {self.getBonusPoint()}점 입니다.'

""" Getter & Setter """
def getCustomerID(self):
return self.__cutomerID

def setCustomerID(self, customerID):
self.__customerID = customerID

def getCustomerName(self):
return self.__customerName

def setCustomerName(self, customerName):
self.__customerName = customerName

def getCustomerGrade(self):
return self.__customerGrade

def setCustomerGrade(self, customerGrade):
self.__customerGrade = customerGrade

def getBonusPoint(self):
return self.__bonusPoint

def setBonusPoint(self, bonusPoint):
self.__bonusPoint = bonusPoint

def getbonusRatio(self):
return self.__bonusRatio

def setbonusRatio(self, bonusRatio):
self.__bonusRatio = bonusRatio
from Customer import Customer

class VIPCustomer(Customer):

__agentID = 1
__saleRatio = 0.0

""" Constructor """
def __init__(self):
# super().__init__() #쓰지 않으면 부모의 기본생성자 호출하지 않음
self.setCustomerGrade('VIP')
self.setbonusRatio(0.05)
self.setSaleRatio(0.1)

""" Method """
def calcPricer(self, price):
self.setBonusPoint(int(price * self.getbonusRatio()))
return int(price - price * self.getSaleRatio())

""" Getter & Setter """
def getAgentID(self):
return self.__agentID

def setAgentID(self, agentID):
if agentID > 0 and type(agentID) == int:
self.__agentID = agentID
else:
print("컨설턴트ID는 숫자며, 자연수여야 합니다.")

def getSaleRatio(self):
return self.__saleRatio

def setSaleRatio(self, saleRatio):
if saleRatio >= 0.0 and saleRatio < 1.0:
self.__saleRatio = saleRatio
else:
print("할인율 오류가 발생하였습니다.")
from Customer import Customer
from VIPCustomer import VIPCustomer

customerLee = Customer()
customerLee.setCustomerName("이순신")

customerKim = VIPCustomer()
customerKim.setCustomerName("김유신")

print(customerLee.showCustomerInfo())
#이순신님의 등급은 SILVER이며, 적립된 보너스 포인트는 0점 입니다.
print(customerKim.showCustomerInfo())
#김유신님의 등급은 VIP이며, 적립된 보너스 포인트는 0점 입니다.

priceLee = customerLee.calcPricer(10000)
priceKim = customerKim.calcPricer(10000)

print(f'{customerLee.getCustomerName()}님의 지불하실 금액은 {priceLee}원 입니다.')
#이순신님의 지불하실 금액은 10000원 입니다.
print(customerLee.showCustomerInfo())
#이순신님의 등급은 SILVER이며, 적립된 보너스 포인트는 100점 입니다.
print(f'{customerKim.getCustomerName()}님의 지불하실 금액은 {priceKim}원 입니다.')
#김유신님의 지불하실 금액은 9000원 입니다.
print(customerKim.showCustomerInfo())
#김유신님의 등급은 VIP이며, 적립된 보너스 포인트는 500점 입니다.

isinstance / issubclass

위의 코드를 이용하여 확인해보자.

isinstance

1
2
3
4
5
6
7
isinstance(object, type)
print(isinstance(Customer, VIPCustomer)) #False
print(isinstance(customerLee, Customer)) #True
print(isinstance(customerKim, Customer)) #True

print(isinstance(customerLee, VIPCustomer)) #False
print(isinstance(customerKim, VIPCustomer)) #True

issubclass

1
2
3
issubclass(sub type, super type)
print(issubclass(VIPCustomer, Customer)) #True
print(issubclass(Customer, VIPCustomer)) #False