developer tip

Python 생성자 및 __init__

copycodes 2020. 8. 25. 08:17
반응형

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)

The testobject will then have an object called some_value that in this sample will be 5.

>>> testobject.some_value
5

But you don't need to set a value for each object like i did in my sample. You can also do like this:

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

then the value of some_value will be 5 and you don't have to set it when you create the object.

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

the >>> and ... in my sample is not what you write. It's how it would look in pyshell...


coonstructors are called automatically when you create a new object, thereby "constructing" the object. The reason you can have more than one init is because names are just references in python, and you are allowed to change what each variable references whenever you want (hence dynamic typing)

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

in your class definition, it just keeps the later one


There is no notion of method overloading in Python. But you can achieve a similar effect by specifying optional and keyword arguments

참고URL : https://stackoverflow.com/questions/8985806/python-constructors-and-init

반응형