기본 import
import pandas as pd
from pandas import Series,DataFrame
emp = pd.read_csv("C:\\data\\emp.csv")
emp.info()
emp.HIRE_DATE = pd.to_datetime(emp.HIRE_DATE) # 문자형 >> 날짜형
import matplotlib.pyplot as plt
from matplotlib import font_manager, rc
font_name = font_manager.FontProperties(fname='C:\\Windows\\Fonts\\malgun.ttf').get_name()
rc('font',family = font_name)
import numpy as np
class Person: info = '' # instance variable def showinfo(self, name, age): self.info += '이름 : {}, 나이 : {}\n'.format(name, age) man = Person() man.info man.showinfo('홍길동',30) man.info # '이름 : 홍길동, 나이 : 30 \n' man.showinfo('박찬호',20) print(man.info) # 이름 : 홍길동, 나이 : 30 # 이름 : 박찬호, 나이 : 20 woman = Person() woman.info woman.showinfo('고애신',21) woman.info # '이름 : 고애신, 나이 : 21\n' woman.showinfo('이양화',22) woman.info # '이름 : 고애신, 나이 : 21\n이름 : 이양화, 나이 : 22\n' |
# \n : 줄바꿈. print로 출력하면 표시 안됨
class Person: hobbys = [] # Global Variable def add_hobbys(self, arg): self.hobbys.append(arg) p1 = Person() p1.hobbys p1.add_hobbys('야구보기') p1.hobbys # ['야구보기'] p1.add_hobbys('만화책보기') p1.hobbys # ['야구보기', '만화책보기'] p2 = Person() p2.add_hobbys('런닝') p2.hobbys # ['야구보기', '만화책보기', '런닝'] >> 다른 변수의 값이 연속으로 출력 됨 |
↓ |
클래스에서 리스트 변수를 instance variable로 만들기 -> def __init__(self): class Person: def __init__(self): # instance Method self.hobbys = [] # instance variable def add_hobbys(self, arg): self.hobbys.append(arg) p1 = Person() p1.hobbys p1.add_hobbys('야구보기') p1.hobbys # ['야구보기'] p1.add_hobbys('만화책보기') p1.hobbys # ['야구보기', '만화책보기'] p2 = Person() p2.add_hobbys('런닝') p2.hobbys # ['런닝'] |
!! 주의 !!
info = '' # 클래스에서 리터럴문자로 선언하면 인스턴스 변수가 되지만
hobbys = [] # 클래스에서 리스트변수를 선언하면 글로벌 변수가 된다.
class showinfo: def __init__(self, arg1, arg2): # 형식매개변수 포함 self.name = arg1 self.age = arg2 def printinfo(self): print('이름 : {}, 나이 : {}'.format(self.name, self.age)) s = showinfo('홍길동', 20) s.printinfo() # 이름 : 홍길동, 나이 : 20 s1 = showinfo('제임스', 30) s1.printinfo() # 이름 : 제임스, 나이 : 30 s2 = showinfo() # 오류 : positional arguments: 'arg1' and 'arg2' |
__init__ 메소드에 형식매개변수가 구성되어 있으면 클래스를 인스턴스화 할 때 실제값을 꼭 입력해야 한다.
# 네임스페이스 확인
s.__dict__ # {'name': '홍길동', 'age': 20} s1.__dict__ # {'name': '제임스', 'age': 30} |
class showinfo: def __init__(self, arg1, arg2): # 형식매개변수 포함 self.name = arg1 self.age = arg2 def __repr__(self): return '2. 이름 : {}, 나이 : {}'.format(self.name, self.age) def __str__(self): return '1. 이름 : {}, 나이 : {}'.format(self.name, self.age) s1 = showinfo('홍길동',20) print(s1) # 1. 이름 : 홍길동, 나이 : 20 str(s1) # '1. 이름 : 홍길동, 나이 : 20' |
__str__ 또는 __repr__ : 인스턴스를 print() 또는 str() 하면 수행되는 메소드이다.
클래스 안에 같이 있을 경우 __str__이 우선 수행된다.
class Test: def test_1(): print('클래스 함수') def test_2(self): print('인스턴스 함수') t1 = Test() t1.test_1() # 오류 : 클래스 함수이기 때문에 인스턴스를 통해서 수행하면 오류 발생 t1.test_2() # 인스턴스 함수 Test.test_1() # 클래스 함수 Test.test_2() # 오류 : 인스턴스 함수이기 때문에 인스턴스를 통해서 수행해야 한다. |
datetime.datetime.now() # 클래스 함수
모듈 클래스 클래스메소드
class Employee: cnt = 0 def __init__(self,arg1,arg2): self.name = arg1 self.age = arg2 self.cnt += 1 # 인스턴스 변수로 되어있어 선언때마다 초기화 됨 def show(self): print('이름 : {}, 나이 : {}'.format(self.name, self.age)) def showcnt(self): print('전체 접속한 인원은 {}명 입니다.'.format(self.cnt)) e1 = Employee('홍길동', 20) e1.show() # 이름 : 홍길동, 나이 : 20 e1.showcnt() # 전체 접속한 인원은 1명 입니다. e2 = Employee('손흥민', 25) e2.show() # 이름 : 손흥민, 나이 : 25 e2.showcnt() # 전체 접속한 인원은 1명 입니다. |
class Employee: cnt = 0 # 처음 인스턴스 생성시에만 작동 def __init__(self, arg1, arg2): # 클래스를 인스턴스할 때 무조건 수행 self.name = arg1 self.age = arg2 Employee.cnt += 1 # 글로벌 변수, 클래스 변수 def show(self): print('이름 : {}, 나이 : {}'.format(self.name, self.age)) def showcnt(self): print('전체 접속한 인원은 {}명 입니다.'.format(Employee.cnt)) def __del__(self): # 인스턴스를 해지할 때(del) 무조건 수행 print('{} 접속해지 했습니다.'.format(self.name)) Employee.cnt -= 1 e1 = Employee('홍길동', 20) e1.show() # 이름 : 홍길동, 나이 : 20 e1.showcnt() # 전체 접속한 인원은 1명 입니다. e2 = Employee('손흥민', 25) e2.show() # 이름 : 손흥민, 나이 : 25 e2.showcnt() # 전체 접속한 인원은 2명 입니다. -- 누적 |
접속을 끊는다 -> 인스턴스 종료(해지) del e3 # 나얼 접속해지 했습니다. e1.showcnt() # 전체 접속한 인원은 2명 입니다. e2.showcnt() # 전체 접속한 인원은 2명 입니다. del e2 # 손흥민 접속해지 했습니다. e1.showcnt() # 전체 접속한 인원은 1명 입니다. e2.showcnt() # 오류: 삭제 됨 |
[문제] Set 클래스를 생성해주세요. |
lst1 = [1,2,3,4,5,6,2,1] lst2 = [4,5,6,8,9,7,4] s = Set(lst1,lst2) s.union() # [1, 2, 3, 4, 5, 6, 7, 8, 9] s.union_all() # [1, 1, 2, 2, 3, 4, 4, 4, 5, 5, 6, 6, 7, 8, 9] s.intersect() # [4, 5, 6] s.minus() # [1, 2, 3] |
class Set: def __init__(self, arg1, arg2): self.x = arg1 self.y = arg2 def union(self): result = [] for i in self.x + self.y: if i not in result: result.append(i) return sorted(result) def union_all(self): return sorted(self.x + self.y) def intersect(self): result = [] for i in self.x: if (i in self.y) and (i not in result): result.append(i) return sorted(result) def minus(self): result = [] for i in self.x: if (i not in self.y) and (i not in result): result.append(i) return sorted(result) if __name__ =='__main__': # 설명서 역할 lst1 = [1,2,3,4,5,6,2,1] lst2 = [4,5,6,8,9,7,4] s = Set() print(s.union(lst1,lst2)) print(s.union_all(lst1,lst2)) print(s.intersect(lst1,lst2)) print(s.minus(lst1,lst2)) |
class Set: def unique(self,arg1,arg2): # __init__ 대체 예시 self.x = arg1 self.y = arg2 self.result1 = [] self.result2 = [] for i in self.x: if i not in self.result1: self.result1.append(i) for i in self.y: if i not in self.result2: self.result2.append(i) return (self.result1, self.result2) def union(self, x, y): re1, re2 = self.unique(x,y) v_uni = [] for i in re1: if i not in re2: v_uni.append(i) v_uni += re2 return sorted(v_uni) ... |
■ 상속
- 클래스의 메소드의 속성을 물려 받는다.
- 공통된 내용을 하나로 묶어서 관리할 수 있다.
class Parents: def __init__(self, name, pn): self.name = name self.pn = pn def show(self): print('이름 : {}, 전화번호 : {}'.format(self.name, self.pn)) class Child(Parents): def __init__(self, name, pn, addr, sn): self.name = name self.pn = pn self.addr = addr self.sn = sn p = Parents('홍길동', '010-1000-0001') p.show() # 이름 : 홍길동, 전화번호 : 010-1000-0001 c = Child('홍하든', '010-0001-1000', '서울', '0000') c.show() # 이름 : 홍하든, 전화번호 : 010-0001-1000 |
↓ |
class child(Parents): def __init__(self, name, pn, addr, sn): # 형식매개변수 4개 Parents.__init__(self, name, pn) self.addr = addr self.sn = sn def show(self): Parents.show(self) print('주소 : {}, 주민번호 : {}'.format(self.addr, self.sn)) c = child('홍하든', '010-0001-1000', '서울', '0000') # 4개 입력 c.show() # 이름 : 홍하든, 전화번호 : 010-0001-1000 # 주소 : 서울, 주민번호 : 0000 |
# 한꺼번에 상속받기
class Add: def add(self, x, y): return x + y class Multiply: def multiply(self, x, y): return x * y class Divide: def divide(self, x, y): return x / y class Calculator(Add, multiply, Divide): def sub(self, x, y): return x - y cal = Calculator() cal.add(10,20) cal.multiply(2,3) cal.divide(10,2) cal.sub(10,2) |
class Calc: def add_instance_method(self,arg1,arg2): return arg1 + arg2 @staticmethod # 클래스 또는 인스턴스를 통해서 처리하는 코디네이더 def add_static_method(arg1,arg2): # 클래스 메소드 return arg1 + arg2 def add_class_method(arg1,arg2): return arg1 + arg2 @classmethod # 클래스 또는 인스턴스를 통해서 처리하는 코디네이더, cls 사용 def add_class_method_new(cls, arg1, arg2): return arg1 + arg2 c = Calc() c.add_instance_method(10,20) # 인스턴스 메소드 Calc.add_instance_method(10,20) # 오류 c.add_static_method(1000,2000) # 3000 Calc.add_static_method(1000,2000) # 3000 Calc.add_class_method(100,200) # 클래스 메소드 c.add_class_method(100,200) # 오류 c.add_class_method_new(1000,2000) Calc.add_class_method_new(1000,2000) |
class Parent: rate = 1.1 @staticmethod def static_compute(value): return value * Parent.rate @classmethod def class_compute(cls, value): return value * Parent.rate class Child(Parent): rate = 1.2 p = Parent() p.static_compute(1000) Parent.static_compute(1000) p.class_compute(1000) Parent.class_compute(1000) c = Child() c.static_compute(1000) Child.static_compute(1000) c.class_compute(1000) # 1100 Child.class_compute(1000) # 1100, 상속을 받았는데 적용이 안됨 |
↓ |
class Parent: rate = 1.1 @staticmethod # 상속을 받아도 부모의 속성을 사용 def static_compute(value): return value * Parent.rate @classmethod # 상속을 줬더라도 호출 입장에서 사용 def class_compute(cls, value): return value * cls.rate class Child(Parent): rate = 1.2 p = Parent() p.static_compute(1000) Parent.static_compute(1000) p.class_compute(1000) Parent.class_compute(1000) c = Child() c.static_compute(1000) # 부모속성을 사용 Child.static_compute(1000) # 부모속성을 사용 c.class_compute(1000) # 1200, 현재 호출하고 있는 클래스의 속성을 사용 Child.class_compute(1000) # 1200, 현재 호출하고 있는 클래스의 속성을 사용 |
class Child1(Parent): rate = 1.5 c = Child1() c.static_compute(1000) Child1.static_compute(1000) c.class_compute(1000) # 1500 Child1.class_compute(1000) # 1500 |
'PYTHON 3.11' 카테고리의 다른 글
36 PYTHON SQLite3, cx_Oracle, 정규표현식 (0) | 2023.11.28 |
---|---|
35 PYTHON 예외사항, SQLite (1) | 2023.11.27 |
33 PYTHON 그래프, CLASS (1) | 2023.11.22 |
32 PYTHON RANK, PANDAS, UNSTACK, PIVOT, MATPLOTLIB (3) | 2023.11.21 |
31 PYTHON isin, null, apply, str, 그룹함수, MERGE (1) | 2023.11.20 |