[python] Python 생성자 및 __init__

생성자를 실제로 “생성자”라고 부르는 이유는 무엇입니까? 그들의 목적은 무엇이며 클래스의 메서드와 어떻게 다릅니 까?

또한 __init__한 클래스에 더 많은 것이있을 수 있습니까? 나는 다음을 시도했는데 누군가 결과를 설명해 주시겠습니까?

>>> class test:
    def __init__(self):
        print "init 1"
    def __init__(self):
        print "init 2"

>>> s=test()
init 2

마지막으로 __init__운영자 오버 로더입니까?



답변

Python에는 함수 오버로딩이 없습니다. 즉, 이름은 같지만 인수가 다른 여러 함수를 가질 수 없습니다.

코드 예제에서, 당신은하지 않을 과부하 __init__() . 두 번째 정의 가 이름 을 새 메소드에 리 바인드__init__ 하여 첫 번째 메소드에 액세스 할 수 없게 만드는 경우가 발생합니다 .

생성자에 대한 일반적인 질문에 관해서 는 Wikipedia 가 좋은 출발점입니다. Python 관련 항목의 경우 Python 문서를 적극 권장합니다 .


답변

생성자를 실제로 “생성자”라고 부르는 이유는 무엇입니까?

생성자 (이름 __new__)는 클래스의 새 인스턴스를 만들고 반환합니다. 따라서 C.__new__클래스 메서드는 클래스 C 의 생성자 입니다.

C.__init__만든 후 인스턴스 메소드는 호출자에게 다시 전달되기 전에를 초기화하기 위해, 특정 인스턴스라고합니다. 따라서이 메서드는 C의 새 인스턴스에 대한 이니셜 라이저 입니다.

클래스의 메서드와 어떻게 다릅니 까?

에 명시된 바와 같이 공식 문서 __init__ 입니다 인스턴스가 생성 된 후라고합니다 . 다른 방법은이 치료를받지 않습니다.

그들의 목적은 무엇입니까?

생성자의 목적은 C.__new__C인스턴스를 생성하는 동안 사용자 지정 동작을 정의하는 것 입니다.

이니셜 라이저의 목적 은 생성 된 후의 C.__init__각 인스턴스에 대한 사용자 지정 초기화를 정의 C하는 것입니다.

예를 들어 Python을 사용하면 다음을 수행 할 수 있습니다.

class Test(object):
    pass

t = Test()

t.x = 10   # here you're building your object t
print t.x

그러나의 모든 인스턴스 가 10과 같은 Test속성을 갖도록하려면 x해당 코드를 내부에 넣을 수 있습니다 __init__.

class Test(object):
    def __init__(self):
        self.x = 10

t = Test()
print t.x

모든 인스턴스 메서드 (클래스의 특정 인스턴스에서 호출되는 메서드)는 인스턴스를 첫 번째 인수로받습니다. 그 인수는 일반적으로 self.

constructor와 같은 클래스 메서드는 __new__대신 클래스를 첫 번째 인수로받습니다.

이제 x속성에 대한 사용자 지정 값을 원한다면 해당 값을 인수로 전달하면됩니다 __init__.

class Test(object):
    def __init__(self, x):
        self.x = x

t = Test(10)
print t.x
z = Test(20)
print t.x

나는 이것이 당신이 의심을 제거하는 데 도움이되기를 바랍니다. 그리고 당신은 이미 다른 질문에 대한 좋은 답변을 받았기 때문에 여기서 멈추겠습니다 🙂


답변

클래스는 단순히 객체를 생성하는 청사진입니다. 생성자는 개체를 만들 때마다 실행되는 일부 코드입니다. 따라서 두 개의 생성자를 갖는 것은 의미가 없습니다. 일어나는 일은 두 번째 오버가 첫 번째를 쓰는 것입니다.

일반적으로 사용하는 것은 다음과 같이 해당 개체에 대한 변수를 만드는 것입니다.

>>> class testing:
...     def __init__(self, init_value):
...         self.some_value = init_value

따라서 다음과 같이이 클래스에서 객체를 생성 할 수 있습니다.

>>> testobject = testing(5)

그러면 testobject some_value에는이 샘플에서 5 가되는 객체 가 있습니다.

>>> testobject.some_value
5

하지만 샘플에서했던 것처럼 각 개체에 대한 값을 설정할 필요가 없습니다. 다음과 같이 할 수도 있습니다.

>>> class testing:
...     def __init__(self):
...         self.some_value = 5

그러면 some_value의 값은 5가되며 개체를 만들 때 설정할 필요가 없습니다.

>>> testobject = testing()
>>> testobject.some_value
5

내 샘플의 >>> 및 …는 당신이 작성한 것이 아닙니다. pyshell에서 어떻게 보일지 …


답변

coonstructor는 새 개체를 만들 때 자동으로 호출되어 개체를 “구성”합니다. 하나 이상의 init를 가질 수있는 이유 는 이름이 파이썬의 참조 일 뿐이며, 원할 때마다 각 변수가 참조하는 것을 변경할 수 있기 때문입니다 (따라서 동적 타이핑).

def func(): #now func refers to an empty funcion
    pass
...
func=5      #now func refers to the number 5
def func():
    print "something"    #now func refers to a different function

클래스 정의에서 나중에


답변

Python에는 메서드 오버로딩 개념이 없습니다. 그러나 선택적 및 키워드 인수를 지정하여 유사한 효과를 얻을 수 있습니다.


답변