파이썬에 내장되어있는 list를 상속하는 class를 만들때
class listed(list):
def __init__(self, aname, ayear=None, atime=[]):
list.__init__([])
self.name=aname
self.year=ayear
self.extend(atime)
이런식으로 만들던데 list.__init__([])이거 의미가 뭐임??
이거 없어도 정상적으로 굴러가는거 같던데
Superclass의 Constructor잖아 ㅇㅅㅇ;;
??? 슈-퍼 클래쓰는 또 뭐시여..
ㄹㅇ 암것도 모르는디;;
부모 ㅇㅅㅇ
그럼 list.__init__([]) 이게 하는 역할이 뭐임? 어떤식으로 동작하는건지 모르겠음.
이거 없어도 프로그램은 정상적으로 굴러가는거 같던데..
혹시 파이썬이 첫 언어니? ㅇㅅㅇ
사실상 첫언어임. c도 해보긴 했는데 정말 맛만보고 끝낸거라
리스트의 경우 없어도 되는건가? 아무튼 원래는 상속된 클래스의 생성자만 불리고 부모 클래스의 생성자가 안 불리면 초기화가 덜 돼서 문제가 생기는 경우가 당연히 많아 ㅇㅅㅇ..
예를 들어 list의 생성자가 불리기 전에는 내부 스토리지가 쓰레기 값이라고 해 보자, 그럼 this.extend(1)을 하면 에러가 발생하겠지? 근데 생성자가 정상적으로 불려서 내부 스토리지가 멀쩡하게 초기화됐으면 문제가 안 생기니까.. 아 설명 못해먹겠다 ㅇㅅㅇ 알아서 공부해
그럼 이건 a=listed(name)이라고 하면 a가 list라고 선언해주는 역할인거임?
self=[]이랑 차이가 없는건가 그럼??
응 그래 self=[]로 묘사하고 싶었던 거랑 굉장히 비슷하다 근데 C의 포인터 생각해봐.. self는 레퍼런스 변수(포인터랑 비슷하다고 상상해봐) 그거 바꾼다고 실제로 바뀌겠니 ㅇㅅㅇ;
아무튼 어떤 OOP언어를 하든 부모클래스는 자주 볼텐데 프갤공식언어 자바로 예를 들면 거기선 super()로 한다 ㅇㅅㅇ 자바식으로 바꾸면 extend도 그냥 extend() 해도 되지만 super.extend()라고 explicit하게 해도 되고
레퍼런스 변수가 뭔진 모르겠지만 어쨌든 self는 내가 임의로 변경할 수 없는 놈이니까 list.__init__([])과 같은 방식으로 선언을 해준다는거?
근데 이거저거 따질 시간에 백문이 불여일견이라고 파이썬 강좌를 보고 따라하든 니가 실험하든 해봐 ㅇㅅㅇ;;
근데 그럼 list자체가 []으로 이루어져있는데 list.__init__()으로 해도 문제는 없는거임?
응 대충 그렇게 알아둬 ㅇㅅㅇ 그게 맞는건 아니지만 지금 저 클래스의 상황에서는 맞아
저거 없는 상태로 해봐도 에러가 안뜨니까 뭘 어떻게 못하겠더라고..
책보고 하는데 책에 상위 클래스의 초기화 메서드를 호출한다 라고 말하고 아무런 설명이 없어서..
(항상 맞는건 아니란 소리야) 그리고 상속이 1단계면 대부분 그게 맞는데 2단계 이상이라고 생각하면(조부모가 존재) 더 일반화 시켜서 생각해야겠지?
자료가 부족하면 니가 인터넷에서 유튜브 보거나 코딩하는걸 추천하는데 이 경우엔 list의 wrapper 클래스를 하나 작성해서 그걸 상속받아보면 감이 올거야 ㅇㅅㅇ
그럼 이렇게 생각하면 되는거임? listed는 list를 상속하는 클래스니까 listed를 초기화하려면 그전에 list가 초기화 되어 있어야 한다? 그럼 3단계로 상속된 클래스는 바로 윗단계(2)만 초기화 해주면 가장 위의 클래스(1)는 윗단계(2)에서 list.__init__과 같은 방식으로 초기화 했으니 따로 해줄 필요가 없는거고?
개씹감동했다 그걸 이해했네 ㅇㅅㅇ
도와줘서 ㄳㄳ
예를들어 listed2가 listed를 상속하는데 listed.__init__()를 안하고 self.name을 읽으려고 하면 None이 나오겠지 ㅇㅅㅇ
근데 __init__([])에서 []는 그럼 없어도 되는거임?
응 맞아 리스트는 기본 생성자가 있어서 ㅇㅅㅇ
근데 listed는 다르겠지 ㅇㅅㅇ 꼭 listed 상속해봐
아 기본생성자가 있어서 선택적인자인가보네. listed상속해보면서 제대로 확인ㅇ해봐야할듯. ㄳㄳ
역시 천재들은 사고방식이 달라서 일반인에게 설명을 잘 못하네..