복붙노트

[PYTHON] 파이썬 : 빌트인리스트 타입으로부터 어떻게 상속받을 수 있습니까?

PYTHON

파이썬 : 빌트인리스트 타입으로부터 어떻게 상속받을 수 있습니까?

내장 목록 유형에 몇 가지 속성을 추가하여 다음과 같이 작성했습니다.

class MyList(list):
    def __new__(cls, *args, **kwargs):
        obj = super(MyList, cls).__new__(cls, *args, **kwargs)
        obj.append('FirstMen')
        return obj

    def __init__(self, *args, **kwargs):
        self.name = 'Westeros'

    def king(self):
        print 'IronThrone'

if __name__ == '__main__':
    my_list = MyList([1, 2, 3, 4])
    print my_list

my_list에는 'FirstMen'요소 만 포함됩니다. 왜 내 __new__ 여기에서 작동하지 않습니다? 그리고 목록과 같은 내장형을 어떻게 상속해야합니까? 그것은 str과 같은 불변의 타입에 대해서도 같은가요?

해결법

  1. ==============================

    1.목록 유형은 일반적으로 __init __ () 메소드 내부에서 목록의 실제 초기화를 수행합니다. 이는 변경 가능한 유형의 규칙이기 때문입니다. 변경할 수없는 유형의 하위 유형을 지정할 때 __new __ () 만 덮어 써야합니다. 목록을 하위 클래스로 만들 때 __new __ ()를 덮어 쓸 수 있지만 사용 사례에 대해서는 그렇게 할 필요가 없습니다. __init __ ()를 덮어 쓰는 것이 더 쉽습니다.

    목록 유형은 일반적으로 __init __ () 메소드 내부에서 목록의 실제 초기화를 수행합니다. 이는 변경 가능한 유형의 규칙이기 때문입니다. 변경할 수없는 유형의 하위 유형을 지정할 때 __new __ () 만 덮어 써야합니다. 목록을 하위 클래스로 만들 때 __new __ ()를 덮어 쓸 수 있지만 사용 사례에 대해서는 그렇게 할 필요가 없습니다. __init __ ()를 덮어 쓰는 것이 더 쉽습니다.

    class MyList(list):
        def __init__(self, *args):
            list.__init__(self, *args)
            self.append('FirstMen')
            self.name = 'Westeros'
    

    이 경우에는 super ()를 사용하지 않는 것이 좋습니다. 여기에서 list .__ init __ ()을 호출하고 싶지 않을 것입니다.

  2. ==============================

    2.우선, __new__을 이해하기위한 연습으로 이것을하고 있습니까? 그렇지 않다면, 당신이하려는 것을 할 수있는 좋은 방법이 거의 확실합니다. 여기서 성취하고자하는 바가 무엇인지 설명해 주시겠습니까?

    우선, __new__을 이해하기위한 연습으로 이것을하고 있습니까? 그렇지 않다면, 당신이하려는 것을 할 수있는 좋은 방법이 거의 확실합니다. 여기서 성취하고자하는 바가 무엇인지 설명해 주시겠습니까?

    즉, 여기에 귀하의 예에서 일어난 일이 있습니다 :

    __new__에 대한 설명은 여기를 참조하십시오. http://docs.python.org/reference/datamodel.html#basic-customization

  3. from https://stackoverflow.com/questions/9432719/python-how-can-i-inherit-from-the-built-in-list-type by cc-by-sa and MIT license