itsource

Python의 수업은 언제 사용해야 하나요?

mycopycode 2022. 9. 27. 23:53
반응형

Python의 수업은 언제 사용해야 하나요?

저는 약 2년 동안 python으로 프로그래밍을 하고 있습니다.주로 데이터(pandas, mpl, numpy)뿐만 아니라 자동화 스크립트와 작은 웹 앱도 사용하고 있습니다.저는 더 나은 프로그래머가 되어 python 지식을 늘리려고 노력하고 있습니다.그 중 마음에 걸리는 것은 (작은 웹 앱에 랜덤 플라스크 코드를 복사하는 것 이외에는) 클래스를 사용한 적이 없다는 것입니다.나는 그것들이 무엇인지 대체로 이해하지만, 왜 단순한 기능보다 그것들을 필요로 하는지 이해할 수 없을 것 같다.

질문에 구체성을 더하는 방법:저는 항상 여러 데이터 소스(mongo, sql, postgres, apis)에서 데이터를 가져와 많은 양의 데이터 멍킹과 포맷을 수행하고 데이터를 csv/excel/html에 쓴 후 이메일로 보냅니다.스크립트의 범위는 최대 250 행에서 최대 600 행입니다.제가 수업을 이용해야 하는 이유와 이유가 있을까요?

클래스는 객체 지향 프로그래밍의 기둥입니다.OOP는 코드 구성, 재사용 가능성 및 캡슐화에 매우 관심이 있습니다.

첫째, 면책사항: OOP는 Python에서 많이 사용되는 다른 패러다임인 Functional Programming과 부분적으로 대조됩니다.Python(또는 대부분의 언어)에서 프로그래밍하는 모든 사람이 OOP를 사용하는 것은 아닙니다.Java 8에서는 객체 지향적이지 않은 작업을 많이 수행할 수 있습니다.OOP를 사용하지 않으려면 사용하지 마십시오.두 번 다시 사용하지 않는 데이터를 처리하기 위해 일회성 스크립트를 작성하는 경우 그대로 쓰십시오.

하지만 OOP를 사용해야 하는 이유는 많습니다.

몇 가지 이유:

  • 조직: OOP는 데이터와 프로시저를 모두 코드로 기술하고 정의하는 잘 알려진 표준 방법을 정의합니다.데이터와 프로시저는 모두 다양한 수준의 정의(다른 클래스)로 저장할 수 있으며 이러한 정의에 대해 설명하는 표준 방법이 있습니다.즉, OOP를 표준적인 방법으로 사용하면 나중에 자신과 다른 사람이 코드를 이해하고 편집하고 사용하는 데 도움이 됩니다.또, 복잡한 임의의 데이터 스토리지 메커니즘(dicts, list, dicts, sets 등의 dicts, 또는 dicts 등의 dicts)을 사용하는 대신에, 데이터 구조의 이름을 붙이고, 그것들을 간단하게 참조할 수 있습니다.

  • 상태: OOP를 통해 상태를 정의하고 추적할 수 있습니다.예를 들어 학생을 처리하는 프로그램(예: 학년 프로그램)을 작성하는 경우 해당 학생에 대해 필요한 모든 정보(이름, 나이, 성별, 학년 수준, 과정, 성적, 교사, 또래, 다이어트, 특수 요구 등)를 한 곳에 보관할 수 있습니다.이 데이터는 개체가 살아있는 한 유지되며 쉽게 사용할 수 있습니다.액세스 가능.

  • 캡슐화:캡슐화를 사용하면 프로시저와 데이터가 함께 저장됩니다.메서드(기능에 대한 OOP 용어)는 해당 메서드가 작업하고 생성하는 데이터와 함께 정의됩니다.접근 제어를 허용하는 Java나 Python과 같은 언어에서는 공개 API를 설명하는 방법에 따라 메서드와 데이터를 사용자에게 숨길 수 있습니다.즉, 코드 변경이 필요하거나 원하는 경우 코드를 구현하기 위해 원하는 모든 작업을 수행할 수 있지만 퍼블릭 API는 동일하게 유지할 수 있습니다.

  • 상속:상속을 사용하면 한 곳에서 데이터와 프로시저를 정의하고 나중에 해당 기능을 재정의하거나 확장할 수 있습니다.예를 들어, Python에서, 나는 종종 사람들의 서브클래스를 만드는 사람들을 봅니다.dict등급 I에서 다른functionality.class를클릭하여추가 기능을 추가합니다를 더한 것이다.일반적인 변화는 키를 기본 값은 알려지지 않은 키에 따라 존재하지 않아 사전에서 요청하면 예외를 throw 합니다는 메서드를 재정의하다.존재하지 않는 사전에서 키를 요청하여 알 수 없는 키에 기반한 기본값을 지정하도록 요청했을 때 예외를 발생시키는 메서드를 재정의하는 것이 일반적인 변경 사항입니다.이것은 당신이 지금 또는 그 이후, 다른 사람들이 네 코드를 연장할 수 있는 여러분의 코드 확장하기 위하고 다른 사람들의 코드를 연장할 수 있게 합니다.이를 통해 현재 또는 나중에 자신의 코드를 확장하고 다른 사용자가 자신의 코드를 확장하도록 허용하며 다른 사용자의 코드를 확장할 수 있습니다.

  • 재사용 가능성:이러한 모든 이유 및 기타 이유로 인해 코드의 재사용성이 향상됩니다.오브젝트 지향 코드를 사용하면 솔리드 코드를 한 번 쓴 후 여러 번 재사용할 수 있습니다.특정 사용 사례에 맞게 조정해야 하는 경우 기존 클래스에서 상속하여 기존 동작을 덮어쓸 수 있습니다.변경이 필요한 경우 기존 공개 메서드 서명을 유지하면서 모든 것을 변경할 수 있습니다.이러한 시그니처는 어느 쪽도 이해할 수 없습니다(바람직합니다).

OOP를 사용하지 않는 몇 가지 이유가 있습니다.사용할 필요가 없습니다.하지만 다행스럽게도 Python과 같은 언어를 사용하면 적은 양 또는 많은 양을 사용할 수 있습니다. 이는 여러분에게 달려 있습니다.

학생용 사용 사례의 예(코드 품질에 대한 보장은 없으며, 예에 불과함)

객체 지향

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]))

함수 상태를 유지해야 할 때 생성기(복귀가 아닌 산출되는 함수)로 수행할 수 없는 경우.발전기는 자체 상태를 유지합니다.

표준 연산자를 재정의하려면 클래스가 필요합니다.

방문자 패턴을 사용할 때마다 클래스가 필요합니다.다른 모든 설계 패턴은 생성기, 컨텍스트 매니저(클래스보다 생성기로 더 잘 구현됨) 및 POD 유형(사전, 목록 및 튜플 등)을 통해 보다 효과적이고 깔끔하게 달성할 수 있습니다.

pythonic 코드를 작성하려면 클래스보다 컨텍스트 매니저와 생성기를 선호해야 합니다.더 깨끗해질 거예요.

기능을 확장하려면 거의 항상 상속이 아닌 억제 기능을 사용할 수 있습니다.

모든 규칙에서 예외는 있습니다.기능을 신속하게 캡슐화(라이브러리 수준의 재사용 가능한 코드가 아닌 테스트 코드 쓰기)하는 경우 상태를 클래스로 캡슐화할 수 있습니다.이것은 간단하고 재사용할 필요가 없습니다.

C++ 스타일 디스트럭터(RIIA)가 필요한 경우 클래스를 사용하고 싶지 않습니다.콘텍스트 매니저가 필요합니다.

네가 제대로 한 것 같아.비즈니스 로직이나 어려운 실제 프로세스를 시뮬레이션해야 하는 경우 클래스는 합리적입니다.예:

  • 공유 상태를 가진 여러 기능
  • 동일한 상태 변수의 복사본 두 개 이상
  • 기존 기능의 동작을 확장하려면 다음과 같이 하십시오.

그리고 이 클래식 비디오를 보시길 권합니다.

클래스는 실세계 엔티티를 정의합니다.만약 당신이 개별적으로 존재하며 다른 사람들과는 별개의 논리를 가지고 있다면, 당신은 그것에 대한 클래스를 만들어야 합니다.예를 들어 데이터베이스 연결을 캡슐화하는 클래스입니다.

그렇지 않으면 클래스를 만들 필요가 없습니다.

Dantiston은 OOP가 왜 유용할 수 있는지에 대한 훌륭한 답변을 제공한다.그러나 OOP가 반드시 필요한 것은 아니며 대부분의 경우 OOP를 사용하는 것이 좋습니다.OOP는 데이터와 방법을 함께 결합할 수 있는 장점이 있습니다.어플리케이션 면에서는 OOP를 사용하는 것은 모든 기능/메서드가 특정 데이터 세트만 취급하고 다른 것은 취급하지 않는 경우라고 생각합니다.

치과 의사 예제의 기능 프로그래밍 리팩터링을 고려합니다.

def dictMean( nums ):
    return sum(nums.values())/len(nums)
# It's good to include automatic tests for production code, to ensure that updates don't break old codes
assert( dictMean({'math':3.3,'science':3.5})==3.4 )

john = {'name':'John', 'age':12, 'gender':'male', 'level':6, 'grades':{'math':3.3}}

# setGrade
john['grades']['science']=3.5

# getGrade
print(john['grades']['math'])

# getGPA
print(dictMean(john['grades']))

때까지 당신은언뜻 보기에 GPA만을 다루는것 같습니다 모두가지 방법 세를 깨닫는 첫번째 보면 단독으로 GPA를 다루는 모든 3방법처럼, 보인다.Student.getGPA()기능은 것이라 맹세의 평균을 계산하기 다른 문제들에 사용 되었지, 그리고 다른 2메서들 것이라 맹세 이미 do.dict읠 수 있평균을 새 삶을 꾸려 나가 계산하는 함수로 일반화되어 다른 문제에 재사용될 수 있으며, 다른 두 가지 방법은 dict가 이미 할 수 있는 것을 재창조합니다가 개괄될 수 있다.

기능적 구현의 이점:

  1. 단순성.심플. 표준 문안 보일러 플레이트 없음class또는 또는selfs.s.
  2. 각 기능 직후에 자동 테스트 코드를 쉽게 추가하여 유지보수가 용이합니다.
  3. 코드 확장에 따라 여러 프로그램으로 쉽게 분할할 수 있습니다.
  4. GPA 계산 이외의 목적으로 재사용 가능.

기능 구현의 손실:

  1. 입력에 타이핑'name',,'age',,'gender'dict 키에 각 시간은 드라이(자신을 반복하지 않아).dict 키는 매번매우 건조하지 않습니다(반복하지 마십시오).dict로 수 .물론 목록은 dict보다 명확하지 않지만 아래에 자동 테스트 코드를 포함하면 문제가 되지 않습니다.

이 예에서는 다루지 않는 문제:

  1. OOP 상속은 함수 콜백으로 대체할 수 있습니다.
  2. OOP 클래스를 호출하려면 먼저 OOP 클래스의 인스턴스를 만들어야 합니다. 때 수 .__init__(self).

당신의 아이디어와 디자인에 달려있습니다.당신이 좋은 디자이너라면 OOP는 다양한 디자인 패턴의 형태로 자연스럽게 나올 것입니다.

단순한 스크립트 수준의 처리를 위해 OOP는 오버헤드가 될 수 있습니다.

재사용성이나 확장성과 같은 OOP의 기본적인 이점을 고려하여 필요 여부를 확인합니다.

OOP는 복잡한 일을 점점 더 단순하게 만듭니다.

OOP를 사용하든 사용하지 않든 단순하게 유지하십시오.어느 쪽이든 간단한 것을 사용하세요.

언급URL : https://stackoverflow.com/questions/33072570/when-should-i-be-using-classes-in-python

반응형