속성, 메소드
속성 : 객체속성, 클래스속성
함수 : 객체메소드, 클래스메소드, 정적메소드
class Emp:
company = '우리사'
def __init__(self,empno=None,ename=None,dept=None): # Emp(), Emp(1,"Smith",10), Emp(empno=1,ename="Smith",dept=10)
self.empno = empno # 객체 변수
self.__ename = ename # 언더바(_) 두 개를 앞에 붙이면 외부에서 바로 접근 불가(자바에서 private과 비슷하다)
self.dept = dept
def __str__(self):
return '{}\t{}\t{}'.format(self.empno, self.__ename, self.dept)
def __eq__(self, other): # ==, 연산자 오버라이딩
return self.empno == other.empno
def __lt__(self,other): # <
return self.empno < other.empno
def __le__(self,other): # <=
return self.empno <= other.empno
def __gt__(self,other): # >
return self.empno > other.empno
def __ge__(self,other): # >=
return self.empno >= other.empno
@classmethod # 클래스 메소드
def set_company(cls, company): # 클래스 메소드는 처음에 오는 매개변수가 객체의 주소가 오는 것이 아니라, 클래스의 주소가 온다
cls.company = company
@property
def name(self):
return self.__ename
@name.setter
def name(self, ename):
self.__ename = ename
@staticmethod # 정적 메소드
def mul(a=0,b=0): # 처음 매개변수가 객체의 주소나 클래스의 주소가 오지 않는다
print(f'{a} * {b} = {a*b}')
객체 생성
emp = Emp(11, "Dennis", 20) # <__main__.Emp at 0x1d0d64a4730>
print(emp) # 11 Dennis 20
emp == emp # True
객체 변수
emp.empno # 11
클래스 변수
Emp.company # '우리사'
객체 변수 생성
emp.company # '다른사', 새로운 객체 변수 생성
객체 변수 변경
emp.empno = 12 # empno가 12로 변경됨
emp.ename = 'Scott' # 세터 메소드 호출 __ename 객체 변수가 변경이 된다
Emp.company # '우리사', 객체의 참조변수를 통해서 클래스의 변수의 값을 변경할 수는 없다
클래스 변수 변경
Emp.set_company('신림사') # 클래스 메소드를 통해서 클래스 변수를 변경한다.
Emp.company # '신림사', 변경이 된 것을 확인할 수 있다.
딕셔너리 형태로 변환
emp.__dict__ # {'empno':1, '_Emp__ename': 'smith', 'dept':10}
클래스의 상속
class Manager(Emp):
def __init__(self,empno,ename,dept,job):
self.empno = empno
self.__ename = ename
self.dept = dept
self.job = 'Manager'
연산자 오버라이드
산술연산자
__add__ # +
__sub__ # -
__mul__ # *
__truediv__ # /
__floordiv__ # //, 소수점 버림 나눗셈
__mod__ # %, 나머지 연산자
__pow__ # **, 제곱 연산자
비교연산자
__lt__ # <
__gt__ # >
__eq__ # ==
__ne__ # !=
__le__ # <=
__ge__ # >=