좋아, 우선 먼저.
파이썬에는 "변수 선언"이나 "변수 초기화"와 같은 것이 없습니다.
단순히 "할당"이라고 부르는 것이 있지만 아마도 "이름 지정"이라고 불러야 할 것입니다.
할당은 "이제 왼쪽에있는이 이름은 이전에 언급 한 내용에 관계없이 오른쪽을 평가 한 결과를 나타냅니다 (있는 경우)"를 의미합니다.
foo = 'bar'
foo = 2 * 3
따라서 Python의 이름 ( "변수"보다 나은 용어)에는 관련 유형이 없습니다. 가치는 그렇습니다. 유형에 관계없이 모든 항목에 동일한 이름을 다시 적용 할 수 있지만 여전히 유형에 따라 동작하는 동작이 있습니다. 이름은 단순히 값 (객체)을 참조하는 방법입니다. 이것은 두 번째 질문에 대한 답 입니다. 사용자 지정 유형을 유지하기 위해 변수를 만들지 않습니다 . 특정 유형을 보유하기 위해 변수를 만들지 않습니다. 변수를 전혀 "생성"하지 않습니다. 개체에 이름을 부여합니다.
두 번째 요점 : Python은 클래스와 관련하여 매우 간단한 규칙을 따릅니다. 이는 실제로 Java, C ++ 및 C #과 같은 언어보다 훨씬 일관 적입니다 . class
블록 내에서 선언 된 모든 것은 클래스의 일부입니다 . 따라서 def
여기에 작성된 함수 ( )는 메소드입니다. 즉, Java, C ++ 및 C #에서와 같이 클래스 객체의 일부 (인스턴스별로 저장되지 않음)입니다. 그러나 여기에 다른 이름 도 수업의 일부입니다. 다시 말하지만, 이름은 이름 일 뿐이며 연관된 유형이 없으며 함수도 Python에서 객체 입니다. 그러므로:
class Example:
data = 42
def method(self): pass
클래스도 파이썬에서 객체 입니다.
이제 우리는 모든 사물의 클래스를 나타내는 라는 객체를 만들었습니다 . 이 개체에는 두 개의 사용자 제공 속성 (C ++에서는 "멤버", C #에서는 "필드 또는 속성 또는 메서드", Java에서는 "필드 또는 메서드")이 있습니다. 그 중 하나는 이름이 지정 되고 정수 값을 저장합니다 . 다른 하나는 이름이 이고 함수 객체를 저장합니다. (Python이 자동으로 추가하는 몇 가지 속성이 더 있습니다.)Example
Example
data
42
method
그러나 이러한 속성은 여전히 실제로 개체의 일부가 아닙니다. 기본적으로 객체는 더 이상 나눌 수없는 것들에 도달 할 때까지 더 많은 이름 (속성 이름)의 묶음 일뿐입니다. 따라서 값은 클래스의 다른 인스턴스간에 공유 될 수 있으며 의도적으로 설정 한 경우 다른 클래스의 개체 간에도 공유 될 수 있습니다.
인스턴스를 만들어 보겠습니다.
x = Example()
이제 우리 x
는의 인스턴스 인 라는 별도의 개체를 갖게되었습니다 Example
. data
및 method
개체의 실제로 일부 있지만, 우리는 여전히 그들을 통해 찾아 볼 수 x
있기 때문에 파이썬이 장면 뒤에 않는 몇 가지 마법. 특히을 조회 할 때 method
대신 "바운드 메소드"를 얻습니다 (이를 호출 할 때 매개 변수 x
로 자동으로 전달되며 직접 self
조회하면 발생할 수 없음 Example.method
).
사용하려고하면 x.data
어떻게 되나요?
우리가 그것을 조사 할 때, 그것은 먼저 객체에서 조회됩니다. 객체에서 찾을 수없는 경우 Python은 클래스를 찾습니다.
그러나에 할당하면 x.data
Python은 객체에 속성을 생성합니다. 그것은 것입니다 하지 클래스 '속성을 대체합니다.
이를 통해 객체 초기화 를 수행 할 수 있습니다 . Python은 __init__
새 인스턴스가 생성 될 때 자동으로 클래스의 메서드를 호출합니다 . 이 메서드에서는 간단히 속성에 할당하여 각 개체의 해당 속성에 대한 초기 값을 설정할 수 있습니다.
class Example:
name = "Ignored"
def __init__(self, name):
self.name = name
이제를 name
만들 때 를 지정해야 Example
하며 각 인스턴스에는 고유 한 name
. 파이썬은 인스턴스의 속성이 먼저 발견 될 것이기 때문에 Example.name
우리 .name
가 인스턴스를 조회 할 때마다 클래스 속성을 무시합니다 .
마지막 경고 : 수정 (변이)과 할당은 서로 다릅니다!
Python에서 문자열은 변경할 수 없습니다. 수정할 수 없습니다. 당신이 할 때 :
a = 'hi '
b = a
a += 'mom'
당신은 변경되지 않습니다 원래 '안녕하세요'문자열입니다. 파이썬에서는 불가능합니다. 대신, 당신은 만들 새 문자열을 'hi mom'
, 그리고 원인 a
의 이름 인 중지 'hi '
하고, 이름있는 시작 'hi mom'
대신. 우리가 만든 b
이름을 'hi '
뿐만 아니라, 그리고 재 - 적용 후 a
이름을 b
아직 이름입니다 'hi '
때문에, 'hi '
여전히 존재하고 변경되지 않았습니다.
그러나 목록은 변경할 수 있습니다.
a = [1, 2, 3]
b = a
a += [4]
이제 b
[1, 2, 3, 4]도 마찬가지입니다. 왜냐하면 우리가 b
그 이름과 같은 이름을 만들고 그 이름을 a
변경했기 때문입니다. a
Python은 단순히 +=
목록을 다르게 취급하기 때문에 이름을 지정할 새 목록을 만들지 않았습니다 .
클래스 속성으로 목록이 있고 인스턴스를 사용하여 목록을 수정 한 경우 변경 사항이 다른 모든 인스턴스에서 "보이기"때문에 이것은 객체에 중요합니다. 이는 (a) 데이터가 실제로 인스턴스 객체가 아니라 클래스 객체의 일부이기 때문입니다. (b) 목록을 수정하고 단순 할당을하지 않았기 때문에 클래스 속성을 숨기는 새 인스턴스 속성을 만들지 않았습니다.