English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
이 글에서는 Python의 핵심 기능, Python 객체와 클래스를 배울 것입니다. 클래스가 무엇인지, 그를 어떻게 생성하고 프로그램에서 사용하는지 배울 것입니다.
Python은 객체 지향적인 프로그래밍 언어입니다. 과정 지향적인 프로그래밍 설계는 주로 함수에 중점을 둡니다. 반면에 객체 지향적인 프로그래밍 설계는 객체에 중점을 둡니다.
객체는 데이터(변수)와 이 데이터에 작용하는 메서드(함수)의 집합입니다. 그리고 클래스는 객체의 블루프린트입니다.
클래스는 집의 스케치(프로토타입)와 같습니다. 이는 바닥, 문, 창 등의 모든 정보를 포함하고 있습니다. 이 설명을 기반으로 집을 짓습니다. 집은 객체입니다.
한 가지 설명을 통해 많은 집을 만들 수 있기 때문에, 클래스를 통해 많은 객체를 생성할 수 있습니다. 객체는 클래스의 예제로 불리며, 이 객체를 생성하는 과정은실체화.
와 같이 함수 정의가 키워드로 시작됩니다.def와 같이 시작됩니다. Python에서는 키워드class은클래스.
첫 번째 문자열은 docstring으로, 해당 클래스에 대한 간단한 설명을 가집니다. 이는 필수적이지 않지만, 이렇게 하는 것이 좋습니다.
이는 간단한 클래스 정의입니다.
class MyNewClass: '''이는 문서 문자열입니다. 새로운 클래스를 생성했습니다''' pass
클래스는 새로운 로컬네임스페이스그리고 그 안에서 모든 속성을 정의합니다. 속성은 데이터나 함수일 수 있습니다.
중요한 속성도 몇 가지 있습니다. 이들은 양쪽 첫 문자가 __로 시작합니다. 예를 들어, __doc__는 해당 클래스의 문서 문자열을 제공합니다.
클래스를 정의하면, 같은 이름의 새로운 클래스 객체가 생성됩니다. 이 클래스 객체는 다른 속성에 접근할 수 있게 하며, 새로운 객체를 실체화할 수 있습니다.
class MyClass: "이는 제 두 번째 클래스" a = 10 def func(self): print('Hello') # 출력: 10 print(MyClass.a) # 출력: <function MyClass.func at 0x0000000003079BF8> print(MyClass.func) # 출력: '이는 제 두 번째 클래스' print(MyClass.__doc__)
프로그램을 실행할 때, 출력은 다음과 같습니다:
10 <function 0x7feaa932eae8="" at="" myclass.func="" 이는 제 두 번째 클래스
우리는 클래스 객체가 다른 속성에 접근할 수 있다는 것을 볼 수 있습니다.
이는 해당 클래스의 새로운 객체 예제(실체화)를 생성하는 데도 사용될 수 있습니다. 객체 생성 과정은 다음과 같습니다.함수호출.
>>> ob = MyClass()
이는 새로운 예제 객체 ob를 생성합니다. 객체의 속성에 접근할 수 있는 이름 앞缀를 사용할 수 있습니다.
속성은 데이터나 메서드일 수 있습니다. 객체의 메서드는 해당 클래스의 함수입니다. 클래스 속성으로 사용되는 모든 함수 객체는 해당 클래스의 객체에 메서드를 정의합니다.
이는 MyClass.func이 함수 객체(클래스 속성)인 이유로, ob.func이 메서드 객체가 됩니다.
class MyClass: "이는 제 두 번째 클래스" a = 10 def func(self): print('Hello') # 새로운 MyClass 생성 ob = MyClass() # 출력: <function MyClass.func at 0x000000000335B0D0> print(MyClass.func) # 출력: <bound method MyClass.func of <__main__.MyClass object at 0x000000000332DEF0>> print(ob.func) # function func() 호출 # 출력: Hello ob.func()
귀하는 이미 클래스 내 함수 정의에서 self 매개변수를 주목했을 가능성이 있습니다. 그러나 우리는 이 메서드를 ob.func()로 간단히 줄여서 표현했을 뿐, 아무런매개변수그래도 유효합니다.
이는 대상이 자신의 메서드를 호출할 때마다 대상 자체가 첫 번째 매개변수로 전달된다는 것을 의미합니다. 따라서 ob.func()는 자동으로 MyClass.func(ob)로 변환됩니다.
일반적으로, n개의 매개변수를 가진 메서드 호출은 첫 번째 매개변수 앞에 대상을 삽입하여 생성된 매개변수 목록을 가진 함수 호출과 동일합니다.
이 이유로, 클래스 내 함수의 첫 번째 매개변수는 대상 자체여야 합니다. 이는 일반적으로self다른 이름을 사용할 수 있지만, 우리는 규약을 따르는 것을 강력히 권장합니다.
이제, 클래스 대상, 예제 대상, 함수 대상, 메서드 대상 및 그 차이에 대해 잘 알아야 합니다.
둘쨰 밑줄(__)로 시작하는 클래스 함수는 특별한 의미를 가지기 때문에 특별 함수로 불립니다.
__init__() 함수는 특히 유용합니다. 이 클래스의 새로운 대상을 예제화할 때마다 이 특별한 함수가 호출됩니다.
이러한 유형의 함수는 대상 지향 프로그래밍(OOP)에서 생성자 함수로도 알려져 있습니다. 우리는 일반적으로 모든 변수를 초기화하는 데 사용합니다.
class ComplexNumber: def __init__(self,r = 0,i = 0): self.real = r self.imag = i def getData(self): print("{0}+{1}"{0}".format(self.real,self.imag)) # 새로운 ComplexNumber 객체를 생성 c1 = ComplexNumber(2,3) # getData() 함수 호출 # 출력: 2+3j c1.getData() # 새로운 ComplexNumber 객체를 생성 # 새로운 속성 'attr'을 생성 c2 = ComplexNumber(5) c2.attr = 10 # 출력: (5, 0, 10) print((c2.real, c2.imag, c2.attr)) # 만c1对象没有属性" attr " # AttributeError: 'ComplexNumber'对象没有属性'attr' c1.attr
위의 예제에서는 복수를 나타내는 새로운 클래스를 정의했습니다. 이 클래스는 __init__() 함수로 변수를 초기화하며 (기본적으로 0), getData() 함수로 숫자를 올바르게 표시합니다.
위의 단계에서 주의해야 할 하나의 흥미로운 점은, 객체의 속성을 동적으로 생성할 수 있다는 것입니다. 우리는 객체 c에 대해2attr라는 새로운 속성을 생성하고 그것을 읽습니다. 하지만 이는 객체 c에 대해서는 아무런 영향을 미치지 않습니다.1이 속성을 생성
우리는 언제든지 객체의 어떤 속성도 del 문장으로 제거할 수 있습니다. 파이썬 셸에서 다음 작업을 시도하여 출력을 확인하세요.
>>> c1 = ComplexNumber(2,3) >>> del c1.imag >>> c1.getData() Traceback (most recent call last): ... AttributeError: 'ComplexNumber' object has no attribute 'imag' >>> del ComplexNumber.getData >>> c1.getData() Traceback (most recent call last): ... AttributeError: 'ComplexNumber' object has no attribute 'getData'
우리는 심지어 객체 자체를 del 문장으로 제거할 수 있습니다.
>>> c1 = ComplexNumber(1,3) >>> del c1 >>> c1 Traceback (most recent call last): ... NameError: name 'c1' is not defined
실제로는 이보다 복잡합니다. 완료되면 메모리에 새로운 예제 객체 c가 생성됩니다1 = ComplexNumber(1,3) 이름c1와 바인딩됩니다.
명령 del c1을 제거하고, 해당 이름 공간에서 이름을 제거합니다c1하지만, 이 객체는 여전히 메모리에 존재하며, 다른 이름 바인딩이 없다면 이 객체는 나중에 자동으로 소멸됩니다.
파이썬에서 이러한 미참조된 객체의 자동 소멸은 쓰레기 수집기라고도 합니다.