한 마디로 super().__init__()은 부모 클래스의 속성 및 메소드를 가져오는 것이다.

class A():
    def __init__(self):
        print ('[*] This is class A')

class B(A):
    def __init__(self):
        super().__init__()
        
if __name__ == "__main__":
    b = B()
(base) C:\github>python test.py
[*] This is class A

 

부모 클래스의 속성 가져오기

A 클래스에 self.name이라는 속성을 추가하였다. 상속을 받는 B 클래스에서는 self.name을 가져와서 사용할 수 있다.

class A():
    def __init__(self):
        self.name = "roytravel"
        print ('[*] This is class A')

class B(A):
    def __init__(self):
        super().__init__()
        print (self.name)
        
if __name__ == "__main__":
    b = B()
(base) C:\github>python test.py
[*] This is class A
roytravel

 

부모 클래스의 메소드 가져오기

A 클래스에 print_name이라는 메소드를 추가하였다. 이후 B 클래스에서 super를 통해 A 클래스의 메소드에 접근할 수 있다.

class A():
    def __init__(self):
        self.name = "roytravel"
        print ('[*] This is class A')
    
    def print_name(self):
        print (self.name)

class B(A):
    def __init__(self):
        super().__init__()
        super().print_name()
        
if __name__ == "__main__":
    b = B()
(base) C:\github>python test.py
[*] This is class A
roytravel

 

 

파이썬 코드를 작성하는데 있어 이따금씩 실수하는 것은 리스트나 딕셔너리 등에 요소를 추가할 때 콤마(,)를 붙이지 않는 것이다.

 

만약 아래와 같이 콤마를 붙이지 않을 경우 아래와 같이 리스트 내부의 요소가 결합되는 것을 확인할 수 있다.

 

위와 같은 것을 문자열 리터럴 결합이라 부르고 파이썬 내부적으로 의도적이고 문서화 되어 있는 동작으로,

 

디버깅 하는데 있어서 오랜 시간이 걸릴 수도 있으므로 주의가 필요하다.

 

따라서 이러한 문제를 피할 수 있는 코드 스타일을 체화 하는 것이 필요하다. 그 방법은 마지막 요소에 항상 콤마(,)를 붙이는 것이다.

 

파이썬 내부적으로는 아래와 같이 쉼표 배치 문제를 해결할 수 있도록 끝에 콤마(,) 이후에 요소가 없더라도 정상적으로 동작하도록 설계해두었다.

 

1. 문제 정의


100개의 계단이 있으며 나는 한 번에 10개의 계단을 오를 수 있는 능력을 가지고 있다.

 

이 때, 100개의 계단을 올라갈 수 있는 경우의 수는 몇 개인가?

 

2. 해결 코드


문제를 보고 생각할 수 있는 가장 초기의 코드를 작성한 것이다.

stairs = 100
skill = 10
table = [0 for i in range(stairs+1)]
table[0] = 1

for i in range(1, stairs+1):
    s=0
    for j in range(1,skill+1):
        if i-j<0:
            t=0
        else:
            t= table[i-j]
        s = s+t
    table[i] = s
print (table[stairs])

 

2. 초기 코드를 확인 후 줄일 수 있는 부분을 확인 후, 파이썬의 강점을 살려 개선 코드를 작성한 것이다

stairs = 100
skill = 10
table = [0 for i in range(stairs+1)]
table[0] = 1

for i in range(1, stairs+1):
    s=0
    for j in range(1,skill+1):
        t=(table[i-j],0)[i-j<0]
        s = s+t
    table[i] = s
print (table[stairs])

 

3. 개선 코드를 작성 후 하나의 함수로 만듦으로써 n 계단 오르기를 구현한 것이다.

def climbing(staris, skill):
    table = [0 for i in range(stairs + 1)]
    table[0] = 1
    for i in range(1, stairs+1):
        s=0
        for j in range(1,skill+1):
            t=(table[i-j],0)[i-j<0]
            s = s+t
        table[i] = s
    return table[stairs]
r =  (climbing(100,10))
print (r)

 

4. 함수의 최적화와 코드의 최적화를 구현한 것이며 아래의 코드는 계단 오르기 문제에 있어 가장 최적화 된 코드이다.

def climbing(n,m):
    table=[0 for i in range(n+1)]
    table[0]=1
    for i in range(1,n+1):
        s=(i-m,0)[(i-m)<0]
        table[i]=sum(table[s:i])
    return table[n]
a=climbing(100,10)
print (a)

+ Recent posts