기본 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