[python] 파이썬에서 __init__과 self는 무엇을합니까?

저는 파이썬 프로그래밍 언어를 배우고 있으며 완전히 이해하지 못하는 것을 발견했습니다.

같은 방법으로 :

def method(self, blah):
    def __init__(?):
        ....
    ....

무엇을 self합니까? 그것은 무엇을 의미합니까? 필수입니까?

뭐라고를 않는 __init__방법은 무엇입니까? 왜 필요한가요? (기타.)

나는 그들이 OOP 구조 일지 모른다고 생각하지만, 많이 모른다.



답변

이 코드에서 :

class A(object):
    def __init__(self):
        self.x = 'Hello'

    def method_a(self, foo):
        print self.x + ' ' + foo

self변수는 객체 자체의 인스턴스를 나타냅니다. 대부분의 객체 지향 언어는이를 객체에 정의 된 메소드에 숨겨진 매개 변수로 전달합니다. 파이썬은 그렇지 않습니다. 명시 적으로 선언해야합니다. A클래스 의 인스턴스를 생성 하고 메소드를 호출 하면 다음 과 같이 자동으로 전달됩니다.

a = A()               # We do not pass any argument to the __init__ method
a.method_a('Sailor!') # We only pass a single argument

__init__방법은 대략 파이썬에서 생성자를 나타내는 것입니다. A()파이썬 을 호출 하면 객체가 생성되어 __init__메서드에 첫 번째 매개 변수로 전달됩니다 . 추가 매개 변수 (예 A(24, 'Hello'):)도 인수로 전달됩니다.이 경우 생성자가 예상하지 않기 때문에 예외가 발생합니다.


답변

네, 맞습니다. 이것들은 oop 구문입니다.

__init__클래스의 생성자입니다. 이 self매개 변수는 개체의 인스턴스를 나타냅니다 ( thisC ++ 에서처럼 ).

class Point:
    def __init__(self, x, y):
        self._x = x
        self._y = y

__init__객체에 대한 메모리가 할당 될 때 불려갑니다 :

x = Point(1,2)

self객체와 함께 값을 유지하려면 객체의 메소드 내부 에서 매개 변수 를 사용하는 것이 중요 합니다. 예를 들어 다음 __init__과 같은 방법 을 구현하면

class Point:
    def __init__(self, x, y):
        _x = x
        _y = y

xy매개 변수는 스택 변수에 저장 될 것이고, init 메소드가 범위를 벗어나면 폐기 될 것이다. 로 그 변수를 설정 self._x하고 self._y의 구성원으로 그 변수를 설정 Point오브젝트 (객체의 수명에 대한 접근).


답변

간단한 예

희망이 조금 도움이되기를 바랍니다. 클래스 내부에 선언 된 변수와 __init__함수 내부에 선언 된 변수의 차이점을 이해하는 데 사용한 간단한 예는 다음과 같습니다.

class MyClass(object):
    i = 123
    def __init__(self):
        self.i = 345

a = MyClass()
print(a.i)
print(MyClass.i)

산출:

345
123


답변

한마디로 :

  1. self그것이 제안했듯이, 그 자체를 참조하십시오 -메소드를 호출 한 객체. 즉, 메소드를 호출하는 N 개의 오브젝트가있는 경우 self.a각 N 개의 오브젝트에 대해 별도의 변수 인스턴스를 참조합니다. a각 객체 에 대한 변수의 N 사본을 상상해보십시오
  2. __init__C ++ / Java와 같은 다른 OOP 언어에서 생성자로 불립니다. 기본 아이디어는 해당 클래스의 객체가 생성 될 때 자동으로 호출되는 특수 메소드라는 것입니다

답변

__init__생성자처럼 작동합니다. 비 정적 메소드로 동작하려면 클래스 함수에 “self”를 첫 번째 인수로 전달해야합니다. “self”는 클래스의 인스턴스 변수입니다.


답변

이 코드를 사용해보십시오. 저와 같은 많은 C 프로그래머가 Py를 배우는 데 도움이되기를 바랍니다.

#! /usr/bin/python2

class Person:

    '''Doc - Inside Class '''

    def __init__(self, name):
        '''Doc - __init__ Constructor'''
        self.n_name = name

    def show(self, n1, n2):
        '''Doc - Inside Show'''
        print self.n_name
        print 'Sum = ', (n1 + n2)

    def __del__(self):
        print 'Destructor Deleting object - ', self.n_name

p=Person('Jay')
p.show(2, 3)
print p.__doc__
print p.__init__.__doc__
print p.show.__doc__

산출:

Jay

Sum = 5

Doc - Inside Class

Doc - __init__ Constructor

Doc - Inside Show

Destructor Deleting object - Jay


답변

클래스 객체속성 참조와 인스턴스화 의 두 가지 작업을 지원합니다.

속성 참조 obj.name : 파이썬의 모든 속성 참조에 사용되는 표준 구문을 사용합니다. 유효한 속성 이름은 클래스 객체를 만들 때 클래스의 네임 스페이스에 있던 모든 이름입니다. 따라서 클래스 정의가 다음과 같은 경우

class MyClass:
    """A simple example class"""
    i = 12345

    def f(self):
        return 'hello world'

다음 MyClass.iMyClass.f각각 정수 및 함수 객체를 반환 유효한 속성 참조이다. 클래스 속성도 할당 할 수 있으므로 할당 값을 변경할 수 있습니다 MyClass.i. __doc__클래스에 속하는 docstring을 리턴하는 유효한 속성입니다 : “간단한 예제 클래스”.

클래스 인스턴스화 는 함수 표기법을 사용합니다. 클래스 객체가 클래스의 새 인스턴스를 반환하는 매개 변수가없는 함수 인 척하십시오. 예를 들면 다음과 같습니다.

x = MyClass()

인스턴스화 (클래스 객체 “호출”) 작업은 빈 객체를 생성합니다. 많은 클래스는 특정 초기 상태로 사용자 정의 된 인스턴스로 오브젝트를 작성하는 것을 좋아합니다. 따라서 클래스는 다음 __init__()과 같은 특수 메소드를 정의 할 수 있습니다 .

def __init__(self):
    self.data = []

클래스가 __init__()메소드를 정의하면 클래스 인스턴스화 __init__()는 새로 작성된 클래스 인스턴스에 대해 자동으로 호출됩니다 . 따라서이 예제에서 초기화 된 새로운 인스턴스는 다음과 같이 얻을 수 있습니다.

x = MyClass()

물론,이 __init__()방법에는 유연성을 높이기위한 주장이있을 수 있습니다. 이 경우 클래스 인스턴스화 연산자에 제공된 인수가에 전달됩니다 __init__(). 예를 들어

class Complex:
    def __init__(self, realpart, imagpart):
        self.r = realpart
        self.i = imagpart

x = Complex(3.0, -4.5)
x.r, x.i

결국 가장 도움이 된 공식 문서 에서 가져 왔습니다 .


여기 내 예가 있습니다

class Bill():
    def __init__(self,apples,figs,dates):
        self.apples = apples
        self.figs = figs
        self.dates = dates
        self.bill = apples + figs + dates
        print ("Buy",self.apples,"apples", self.figs,"figs
                and",self.dates,"dates.
                Total fruitty bill is",self.bill," pieces of fruit :)")

Bill 클래스의 인스턴스를 만들 때 :

purchase = Bill(5,6,7)

당신은 얻는다 :

> Buy 5 apples 6 figs and 7 dates. Total fruitty bill is 18  pieces of
> fruit :)