본문 바로가기
Python

Python 다중, 중첩 Class, Sub Class

by 올엠 2022. 8. 2.
반응형

Python는 상속이 기본적으로 제공하는 프로그램 언어이다. 필요한 경우 다중 상속을 이용하여 보다 유연한 코드 작성이 가능하다.
다중 Class는 프로드램의 성능에는 개선이 없지만, 코드의 유지 관리 측면에서 상당한 이점이 있다.
Class는 __init__라는 중요한 생성자가 있고, 클래스의 현재 인스턴스를 참조하는self 키워드를 사용하여 클래스 내 지정된 변수를 사용할 수 있는데 다중 클래스에서도 가져다 사용이 가능하다.
예를 들어 DB Class를 만들때 DB 연결이후 해당 클래스내부에 Table Class를 통해 코드 간결성을 구성하는 것도 가능할 수 있다.

class DB:
    def __init__(self, database, table):
        self.database = database
        self.intable = self.Table(table)
    def db_update(self, item):
        self.intable.update(item)

    class Table:
        def __init__(self, table):
            self.table = table

        def update(self, url):
            print(url, self.table, "is Updated")

sec_db = DB("Security", "Korea_Table")

sec_db.db_update("asecurity.dev")

위 코드 처럼 DB 연결한 이후 테이블 별 Update가 있다면 여기에 지정해서 사용이 가능하다.
물론 이는 테이블 및 코드의 재사용이 높은 경우 저정하여 사용하는 것이 용이하다 할 수 있다.

하지만 실제로는 DB update와 같은 함수는 다양하게 쓰일 수 있기 때문에 Sub Class로는 적합하지 않다.

class DB:
    def __init__(self, database, table):
        self.database = database
        self.table = table

def update(table, url):
    print(url, table, "is Updated")

sec_db = DB("Security", "Korea_Table")


update(sec_db.table, "asecurity.dev")

 

따라서 다중, 중첩 Class를 구성한다고 하면 다음과 같은 관계성을 고려하는 것이 좋다.

아래는 Log의 포맷을 변경하는 부분을 하위에 클래스로 구성한 것이라 할 수 있다.

이처럼 Class 내에 존재 할 때,  특정 기능의 구성을 변경하는 것과 같은 용도로 사용한다면 유용 할 수 있다.

class Log:
    def __init__(self, level, log, format):
        self.level = level
        self.log = log
        self.changeformat = self.Format(format)


    def format_change(self, change_type):
        if change_type == 'a':        
            self.changeformat.change_atype(change_type)
        else:
            self.changeformat.change_btype(change_type)
    # 포맷을 변경하는 용도로 사용한다.
    class Format:
        def __init__(self, format):
            self.format = format

        def change_atype(self, type):
            print('change_type', type)

        def change_btype(self, type):
            print('change_type', type)
        
        ''':TODO something'''


sec_log = Log("info", "asecurity log", 'a')

sec_log.format_change('b')
반응형

댓글0