저는 파이썬 프로그래밍 언어를 배우고 있으며 완전히 이해하지 못하는 것을 발견했습니다.
같은 방법으로 :
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
매개 변수는 개체의 인스턴스를 나타냅니다 ( this
C ++ 에서처럼 ).
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
내 x
및 y
매개 변수는 스택 변수에 저장 될 것이고, 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
답변
한마디로 :
self
그것이 제안했듯이, 그 자체를 참조하십시오 -메소드를 호출 한 객체. 즉, 메소드를 호출하는 N 개의 오브젝트가있는 경우self.a
각 N 개의 오브젝트에 대해 별도의 변수 인스턴스를 참조합니다.a
각 객체 에 대한 변수의 N 사본을 상상해보십시오__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.i
과 MyClass.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 :)