<jupyter_start><jupyter_text>- 데코레이터- 클래스  Decorator- 함수에서 코드를 변경하지 않고 함수의 기능을 수정하는 방법- 함수내에 있는 코드의 중복을 제거하기 위해서도 사용```def func1():    code1    code2    code3    def func2():    code1    code4    code3```- 데코레이터```def deco(func):    code1    func()    code3@decodef func1():    code2@decodef func2():    code4```  decorator exam<jupyter_code>def func1():
    print("code1")
    print("code2")
    print("code3")
def func2():
    print("code1")
    print("code4")
    print("code3")
func1()
func2()
# 데코레이터 사용
def deco(func):
    
    def wrapper(*args, **kwargs):
        print("code1")
        func(*args, **kwargs)
        print("code3")
    
    return wrapper
@deco
def func1():
    print("code2")
@deco
def func2():
    print("code4")
func1()
func2()
def check_pw(func):
    
    def wrapper(*args, **kwargs):
        pw = ["dss", "test"]
        while True:aaaa
            input_pw = input("input password(quit:q) : ")
            if input_pw in pw:
                result = func(*args, **kwargs)
                return result
            elif input_pw == "q":
                break
            else:
                print("wrong password!!!")
        
    return wrapper
import random

@check_pw
def random_number():
    return random.randint(0, 5)
def disp1():
    return "datascience!!!"
@check_pw
def disp2():
    return "notebook!!!"
random_number()
# input password : dss
# 3
# input password : <PASSWORD>
# wrong password!!!
# input password(quit:q) : q
# 종료
# 데코레이터의 아규먼트 설정
from functools import wraps

def disp(data):
    
    def inner_function(func):
        
        @wraps(func)
        def wrapper(*args, **kwargs):
            print("code1", data)
            result = func(*args, **kwargs)
            print("code3", data)
            return result
            
        return wrapper
    
    return inner_function
    
@disp("test") # > @inner_function
def func1():
    print("code2")
func1()
ls = [1,2,3]
1 in ls<jupyter_output><empty_output><jupyter_text>Class- 함수와 변수를 하나의 기능 단위로 묶어서 사용하는 방법- 객체지향의 개념을 가지고 코드를 작성할수 있습니다.- 여러명이 하나의 프로그램을 개발할때 협업의 효율을 증대시키기 위해서 나온 개념- 생성자 : 클래스가 객체로 만들어질때 실행되는 함수로 메서드에서 사용하는 변수를 선언할때 사용- 상속 : 다른 클래스의 변수와 메서드를 가져와서 사용할때 사용<jupyter_code>class Calc:
    
    def __init__(self, num1, num2):
        self.num1 = num1
        self.num2 = num2
        
    def plus(self):
        return self.num1 + self.num2
# A
calc1 = Calc(1, 2)
# B
calc2 = Calc(2, 3)
calc1.plus(), calc2.plus()
class Calc2:
    
    def __init__(self, num1, num2):
        self.num1 = num1
        self.num2 = num2
        
    def plus(self):
        return self.num1 + self.num2
    
    def minus(self):
        return self.num1 - self.num2
calc2 = Calc2(1, 2)
methods = [func for func in dir(calc2) if func[0] != "_"]
methods
class Calc3(Calc):
    
    def minus(self):
        return self.num1 - self.num2
calc3 = Calc3(1, 2)
methods = [func for func in dir(calc3) if func[0] != "_"]
methods<jupyter_output><empty_output><jupyter_text>클래스의 메서드 3종류- 인스턴스 메서드- 클래스 메서드- 스태틱 메서드<jupyter_code>dir(Calc)<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.1295691906005222, 'fraction_numerical': 0.029046997389033942, 'mean_word_length': 2.4169453734671125, 'pattern_counts': {'":': 1, '<': 14, '<?xml version=': 0, '>': 15, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '3', 'dir': 'jupyter-structured-clean-dedup', 'id': '17782', 'license': 'MIT', 'n_tokens_mistral': 1326, 'n_tokens_neox': 1492, 'n_words': 300, 'path': 'python/io,regex,package,linked_list/code/01_python_summary.ipynb', 'repo_name': 'yeonghwanchoi/TIL', 'size': '3058'}