python
이 자습서에서는 Python 개체 및 클래스의 핵심 기능에 대해 배웁니다. 클래스가 무엇인지, 클래스를 만들고 프로그램에서 사용하는 방법을 배우게 됩니다.
파이썬은 객체 지향 프로그래밍 언어입니다. 함수에 중점을 둔 프로시저 지향 프로그래밍과 달리 객체 지향 프로그래밍은 객체에 중점을 둡니다.
객체는 단순히 데이터(변수)와 해당 데이터에 작용하는 메서드(함수)의 모음입니다. 마찬가지로 클래스는 해당 개체의 청사진입니다.
우리는 클래스를 집의 스케치(프로토타입)로 생각할 수 있습니다. 여기에는 바닥, 문, 창문 등에 대한 모든 세부 정보가 포함되어 있습니다. 이러한 설명을 기반으로 집을 짓습니다. 집이 오브제입니다.
집의 청사진으로 많은 집을 만들 수 있듯이 클래스에서 많은 개체를 만들 수 있습니다. 객체는 클래스의 인스턴스라고도 하며 이 객체를 생성하는 프로세스를 인스턴스화라고 합니다. .
<시간>파이썬에서 함수 정의가 def 키워드로 시작하는 것처럼 클래스 정의는 class 키워드로 시작합니다.
클래스 내부의 첫 번째 문자열은 docstring이라고 하며 클래스에 대한 간략한 설명이 있습니다. 필수 사항은 아니지만 적극 권장합니다.
다음은 간단한 클래스 정의입니다.
class MyNewClass:
'''This is a docstring. I have created a new class'''
pass
클래스는 모든 속성이 정의된 새 로컬 네임스페이스를 만듭니다. 속성은 데이터 또는 함수일 수 있습니다.
이중 밑줄 __
로 시작하는 특수 속성도 있습니다. . 예:__doc__
해당 클래스의 독스트링을 제공합니다.
클래스를 정의하자마자 동일한 이름으로 새 클래스 객체가 생성됩니다. 이 클래스 개체를 사용하면 다른 속성에 액세스하고 해당 클래스의 새 개체를 인스턴스화할 수 있습니다.
class Person:
"This is a person class"
age = 10
def greet(self):
print('Hello')
# Output: 10
print(Person.age)
# Output: <function Person.greet>
print(Person.greet)
# Output: "This is a person class"
print(Person.__doc__)
출력
10 <function Person.greet at 0x7fc78c6e8160> This is a person class<시간>
클래스 개체를 사용하여 다른 속성에 액세스할 수 있음을 확인했습니다.
또한 해당 클래스의 새 개체 인스턴스(인스턴스화)를 만드는 데 사용할 수도 있습니다. 객체를 생성하는 절차는 함수 호출과 유사합니다.
>>> harry = Person()
그러면 harry라는 새 개체 인스턴스가 생성됩니다. . 객체 이름 접두사를 사용하여 객체의 속성에 액세스할 수 있습니다.
속성은 데이터 또는 메소드일 수 있습니다. 개체의 메서드는 해당 클래스의 해당 기능입니다.
이것은 Person.greet
이후로 함수 객체(클래스의 속성), Person.greet
메서드 개체가 됩니다.
class Person:
"This is a person class"
age = 10
def greet(self):
print('Hello')
# create a new object of Person class
harry = Person()
# Output: <function Person.greet>
print(Person.greet)
# Output: <bound method Person.greet of <__main__.Person object>>
print(harry.greet)
# Calling object's greet() method
# Output: Hello
harry.greet()
출력
<function Person.greet at 0x7fd288e4e160> <bound method Person.greet of <__main__.Person object at 0x7fd288e9fa30>> Hello
self
클래스 내부의 함수 정의에 매개변수가 있지만 간단히 harry.greet()
로 메서드를 호출했습니다. 아무 주장 없이. 여전히 효과가 있었습니다.
객체가 메서드를 호출할 때마다 객체 자체가 첫 번째 인수로 전달되기 때문입니다. 따라서 harry.greet()
Person.greet(harry)
로 변환 .
일반적으로 n개의 인수 목록으로 메서드를 호출하는 것은 첫 번째 인수 앞에 메서드의 개체를 삽입하여 생성된 인수 목록으로 해당 함수를 호출하는 것과 같습니다.
이러한 이유로 클래스에 있는 함수의 첫 번째 인수는 객체 자체여야 합니다. 이것을 일반적으로 self라고 합니다. . 이름을 달리 지정할 수 있지만 규칙을 따르는 것이 좋습니다.
이제 클래스 개체, 인스턴스 개체, 함수 개체, 메서드 개체 및 이들의 차이점에 대해 잘 알고 있어야 합니다.
<시간>
이중 밑줄 __
로 시작하는 클래스 함수 특별한 의미가 있기 때문에 특수 기능이라고 합니다.
특히 관심을 끄는 것은 __init__()
입니다. 기능. 이 특수 함수는 해당 클래스의 새 개체가 인스턴스화될 때마다 호출됩니다.
이러한 유형의 함수는 객체 지향 프로그래밍(OOP)에서 생성자라고도 합니다. 일반적으로 모든 변수를 초기화하는 데 사용합니다.
class ComplexNumber:
def __init__(self, r=0, i=0):
self.real = r
self.imag = i
def get_data(self):
print(f'{self.real}+{self.imag}j')
# Create a new ComplexNumber object
num1 = ComplexNumber(2, 3)
# Call get_data() method
# Output: 2+3j
num1.get_data()
# Create another ComplexNumber object
# and create a new attribute 'attr'
num2 = ComplexNumber(5)
num2.attr = 10
# Output: (5, 0, 10)
print((num2.real, num2.imag, num2.attr))
# but c1 object doesn't have attribute 'attr'
# AttributeError: 'ComplexNumber' object has no attribute 'attr'
print(num1.attr)
출력
2+3j (5, 0, 10) Traceback (most recent call last): File "<string>", line 27, in <module> print(num1.attr) AttributeError: 'ComplexNumber' object has no attribute 'attr'
위의 예에서 우리는 복소수를 나타내는 새로운 클래스를 정의했습니다. __init__()
라는 두 가지 기능이 있습니다. 변수 초기화(기본값은 0) 및 get_data()
숫자를 올바르게 표시하려면.
위 단계에서 주목해야 할 흥미로운 점은 객체의 속성이 즉석에서 생성될 수 있다는 것입니다. 새 속성 attr을 만들었습니다. num2 개체에 대해 그리고 읽기도 합니다. 그러나 이것은 num1 개체에 대한 속성을 생성하지 않습니다. .
<시간>
del
을 사용하여 개체의 모든 속성을 언제든지 삭제할 수 있습니다. 성명. 출력을 보려면 Python 셸에서 다음을 시도하십시오.
>>> num1 = ComplexNumber(2,3)
>>> del num1.imag
>>> num1.get_data()
Traceback (most recent call last):
...
AttributeError: 'ComplexNumber' object has no attribute 'imag'
>>> del ComplexNumber.get_data
>>> num1.get_data()
Traceback (most recent call last):
...
AttributeError: 'ComplexNumber' object has no attribute 'get_data'
del 문을 사용하여 객체 자체를 삭제할 수도 있습니다.
>>> c1 = ComplexNumber(1,3)
>>> del c1
>>> c1
Traceback (most recent call last):
...
NameError: name 'c1' is not defined
실제로는 그보다 더 복잡합니다. c1 = ComplexNumber(1,3)
를 수행할 때 , 새 인스턴스 개체가 메모리에 생성되고 이름이 c1입니다. 결합합니다.
del c1
명령에서 , 이 바인딩이 제거되고 이름 c1 해당 네임스페이스에서 삭제됩니다. 그러나 개체는 메모리에 계속 존재하며 다른 이름이 바인딩되어 있지 않으면 나중에 자동으로 소멸됩니다.
Python에서 이러한 참조되지 않은 개체의 자동 소멸을 가비지 수집이라고도 합니다.
<그림>python
이 장에서는 Java의 내부 클래스에 대해 설명합니다. 중첩 클래스 Java에서 메소드와 마찬가지로 클래스의 변수도 다른 클래스를 멤버로 가질 수 있습니다. 다른 클래스 내에 클래스를 작성하는 것은 Java에서 허용됩니다. 내부에 작성된 클래스를 중첩 클래스라고 합니다. , 내부 클래스를 보유하는 클래스를 외부 클래스라고 합니다. . 구문 다음은 중첩 클래스를 작성하는 구문입니다. 여기에서 Outer_Demo 클래스 외부 클래스이고 Inner_Demo 클래스입니다. 중첩 클래스입니다. class Outer_Demo {
소방서는 미국에서만 매년 백만 건 이상의 화재에 대응합니다. 그리고 그 숫자는 1970년대 이후 꾸준히 감소하고 있지만 화재는 여전히 발생할 때마다 극도로 위험한 상황의 가능성을 제시합니다. 그러나 그것들은 모두 타지만 모든 불이 같은 것은 아닙니다. 화재를 분류하고 진화하는 방법을 위해 소방 전문가들은 화재를 분류하는 시스템을 개발했습니다. 화재 등급은 무엇을 설명합니까? 화재 등급은 가장 좋은 소화 또는 진압 방법을 포함하여 다른 공통 기능과 함께 존재하는 연료 소스를 설명합니다. 정밀 가공과 같이 화재 위험이 높은 산업에서