클래스는 객체 지향 프로그래밍 의 기둥입니다 . OOP는 코드 구성, 재사용 성 및 캡슐화에 크게 관심이 있습니다.
첫째, 면책 조항 : OOP는 부분적으로 파이썬에서 많이 사용되는 다른 패러다임 인 Functional Programming 과 대조됩니다 . 파이썬 (또는 대부분의 언어)으로 프로그래밍하는 모든 사람이 OOP를 사용하는 것은 아닙니다. Java 8에서는 객체 지향적이지 않은 많은 작업을 수행 할 수 있습니다. OOP를 사용하지 않으려면 사용하지 마십시오. 다시는 사용하지 않을 데이터를 처리하기 위해 일회용 스크립트를 작성하는 경우에는 그대로 사용하십시오.
그러나 OOP를 사용해야하는 많은 이유가 있습니다.
몇 가지 이유 :
조직 : OOP는 코드에서 데이터와 프로 시저를 모두 설명하고 정의하는 잘 알려진 표준 방법을 정의합니다. 데이터와 프로시 저는 다양한 수준의 정의 (다른 클래스로)로 저장 될 수 있으며 이러한 정의에 대해 이야기하는 표준 방법이 있습니다. 즉, 표준 방식으로 OOP를 사용하면 나중에 자신과 다른 사람이 코드를 이해하고 편집하고 사용하는 데 도움이됩니다. 또한 복잡한 임의의 데이터 저장 메커니즘 (dicts 또는 list 또는 dicts 또는 set of dicts 등의 목록 등)을 사용하는 대신 데이터 구조의 이름을 지정하고 편리하게 참조 할 수 있습니다.
상태 : OOP는 상태를 정의하고 추적하는 데 도움이됩니다. 예를 들어, 전형적인 예에서 학생을 처리하는 프로그램 (예 : 학년 프로그램)을 작성하는 경우 필요한 모든 정보를 이름, 나이, 성별, 학년, 코스, 성적, 교사, 동료,식이 요법, 특별 요구 사항 등),이 데이터는 개체가 살아있는 한 지속되며 쉽게 액세스 할 수 있습니다.
캡슐화 : 캡슐화를 통해 프로 시저와 데이터가 함께 저장됩니다. 방법 (함수에 대한 OOP 용어)은 작동하고 생성하는 데이터와 함께 정의됩니다. 액세스 제어 를 허용하는 Java와 같은 언어 또는 Python에서는 공용 API를 설명하는 방법에 따라 메소드와 데이터를 사용자에게 숨길 수 있습니다. 이것이 의미하는 바는 코드를 필요로하거나 변경하려는 경우 코드 구현에 원하는 모든 작업을 수행 할 수 있지만 공개 API는 동일하게 유지한다는 것입니다.
상속 : 상속을 사용하면 한 곳에서 (한 클래스에서) 데이터와 프로 시저를 정의한 다음 나중에 해당 기능을 재정의하거나 확장 할 수 있습니다. 예를 들어, 파이썬에서는 dict
추가 기능을 추가하기 위해 클래스의 하위 클래스를 만드는 사람들이 종종 있습니다 . 일반적인 변경은 알 수없는 키를 기반으로 기본값을 제공하기 위해 존재하지 않는 사전에서 키를 요청할 때 예외를 발생시키는 메소드를 대체하는 것입니다. 이를 통해 지금 또는 나중에 자신의 코드를 확장하고, 다른 사람들이 귀하의 코드를 확장하고, 다른 사람들의 코드를 확장 할 수 있습니다.
재사용 성 : 이러한 모든 이유 및 기타 이유로 인해 코드의 재사용 성이 향상됩니다. 객체 지향 코드를 사용하면 견고한 (테스트 된) 코드를 한 번 작성한 다음 반복해서 재사용 할 수 있습니다. 특정 사용 사례에 맞게 무언가를 조정해야하는 경우 기존 클래스에서 상속하고 기존 동작을 덮어 쓸 수 있습니다. 무언가를 변경해야 할 경우 기존의 공개 메소드 서명을 유지하면서 모든 것을 변경할 수 있으며 아무도 현명하지 않습니다.
다시 말하지만 OOP를 사용하지 않는 몇 가지 이유가 있으며 필요하지 않습니다. 그러나 운 좋게 파이썬과 같은 언어를 사용하면 약간 또는 많이 사용할 수 있습니다.
학생 유스 케이스의 예 (코드 품질에 대한 보장은 아니며 단지 예) :
객체 지향
class Student(object):
def __init__(self, name, age, gender, level, grades=None):
self.name = name
self.age = age
self.gender = gender
self.level = level
self.grades = grades or {}
def setGrade(self, course, grade):
self.grades[course] = grade
def getGrade(self, course):
return self.grades[course]
def getGPA(self):
return sum(self.grades.values())/len(self.grades)
# Define some students
john = Student("John", 12, "male", 6, {"math":3.3})
jane = Student("Jane", 12, "female", 6, {"math":3.5})
# Now we can get to the grades easily
print(john.getGPA())
print(jane.getGPA())
표준 딕트
def calculateGPA(gradeDict):
return sum(gradeDict.values())/len(gradeDict)
students = {}
# We can set the keys to variables so we might minimize typos
name, age, gender, level, grades = "name", "age", "gender", "level", "grades"
john, jane = "john", "jane"
math = "math"
students[john] = {}
students[john][age] = 12
students[john][gender] = "male"
students[john][level] = 6
students[john][grades] = {math:3.3}
students[jane] = {}
students[jane][age] = 12
students[jane][gender] = "female"
students[jane][level] = 6
students[jane][grades] = {math:3.5}
# At this point, we need to remember who the students are and where the grades are stored. Not a huge deal, but avoided by OOP.
print(calculateGPA(students[john][grades]))
print(calculateGPA(students[jane][grades]))