생성자를 실제로 “생성자”라고 부르는 이유는 무엇입니까? 그들의 목적은 무엇이며 클래스의 메서드와 어떻게 다릅니 까?
또한 __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에는 메서드 오버로딩 개념이 없습니다. 그러나 선택적 및 키워드 인수를 지정하여 유사한 효과를 얻을 수 있습니다.