オブジェクト向けプログラミング(OOP)オブジェクト向けプログラミング(Python)


OOPとは?


OOPとは、C言語のようなプロセス向けのプログラミングではなく、オブジェクトの観点からオブジェクト向けのプログラミングを指す.

対象とは?


対象を表す単語.例えば、人も物も客体と呼ぶことができます.同じ人や物事でも、顔が少し違うので客体といえます.

クラス(Class)


以上述べたオブジェクトが共通に持つ属性集合はクラスを定義しているといえる.設計図とも言えます.
オブジェクトとクラスを下図で理解しましょう.

画像ソース:python-tutorial-classes-and-objects
上図の確認により,自動車の属性クラスによって各3種類の自動車が生成されていることがわかる.
自動車を製造するフレーム類は、自動車の色、自動車メーカー、自動車の型番名を属性とする.各アトリビュート値を持つ車は、それぞれのオブジェクトになります.

≪インスタンス|Instance|emdw≫


クラスを使用するには、まずクラスタイプのオブジェクト(object)を宣言する必要があります.このようにクラスからオブジェクトを宣言するプロセスをクラスのインスタンス化と呼ぶ.
また、このように宣言されたクラスタイプのオブジェクトをインスタンス(instance)と呼ぶ.
インスタンスとは、メモリに割り当てられたオブジェクトです.

インスタンスの例

# 자동차 클래스 생성
class Car():
    def __init__(self, color, company, model):
        self.color = color
        self.company = company
        self.model = model
# Mustang 객체에 클래스의 각 필드 속성을 입력하여 클래스의 인스턴스화
Mustang = Car(color='Red', company='Ford', model='Mustang')
print(Mustang)
print(id(Mustang))
# 생성된 자동차 객체
# >> <__main__.Car object at 0x00000209DD73D490>
# 할당된 메모리
# >> 2241393317008

OOP特性


パッヶージ


カプセル化は、通常、関連変数と関数をクラスに組み合わせる操作です.
すなわち、クラスを作成する際には、クラスによって作成されたオブジェクトが特定の目的をうまく実現するために必要な変数と変数を有し、関連する動作が可能になるように、クラスにメソッドを構成する必要があります.

カプセル化された情報を隠す


カプセル化された情報隠蔽は,一部の実装内容を外部に隠す効果である.クラス内の情報は、アクセス指定子によって(은닉)を制限することができ、変更する必要のない重要な情報がPublicと宣言された場合、誰もがアクセスして変更することができる.これらのセクションは、データを保護し、アクセスを制限するために専用として宣言できます.
このように保護された変数はgetterやsetterなどの方法で間接的にアクセスするしかなく,カプセル化の重要な目的である.

パッケージの例

class AM():
    def __init__(self):
        self.public = 'Public'
        self.__private = 'Private'

    @property
    def private(self):
        return self.__private
    @private.setter
    def private(self, private):
        self.__private = private

X = AM()
# Private를 통해 변수에 직접적인 접근 제한
print(X.__private)
# >> AttributeError: 'AM' object has no attribute '__private'

# getter, setter를 통해서 접근
print(X.private)
# >>> Private

X.private = 'Change'

print(X.private)
# >>> Change

抽象


複雑な内容の核心概念と機能を要約する.
抽象化は,具体的な事物間の共通点をとり,差異の一般化を捨てること,あるいは重要な部分を強調するために,不要な細部を取り除き,簡単にすることである.
ウサギやカメのような対象があるとすれば、これらの対象は動物の概念として抽象化することができる.

  • 共通の特徴をとり,差異を捨てる.
    呼吸、移動.토끼가 뛰고, 거북이가 기어가는 차이점은 버린다.

  • 不要な細部を取り除くことで簡略化します.
    足が4本あり、しっぽがあります.이외에 토끼는 큰 귀가 있다, 거북이는 등껍질이 있다 등 세부사항 제거
  • 呼吸して、移動して、4本の足があって、しっぽがあります.これらの特徴により、動物として抽象化することができる.動物は抽象類(상위 클래스)となり,継承後個別のウサギ,亀類(하위클래스)を生成する.

    抽象化の例

    from abc import *    # abc 모듈의 클래스와 메소드를 갖고온다.(abc : abstract base class)
    
    # 추상 클래스
    class People(metaclass=ABCMeta):  
    
    # 추상 메소드
        @abstractmethod # 추상 메소드에는 @abstractmethod를 선언해줘야 함
        def charecter(self): 
            pass        # 추상 메소드는 기능 내 실제 실행내용은 없다.
    
    # 상속받는 클래스
    class Student(People):
        def charecter(self, pow, think, score):
            self.pow = pow
            self.think = think
            self.score = score
            print('체력: {0}'.format(self.pow))
            print('생각: {0}'.format(self.think))
            print('성적: {0}'.format(self.score))
    
    # 상속받는 클래스
    class Driver(People):
        def charecter(self, pow, think, pay):
            self.pow = pow
            self.think = think
            self.pay = pay
    
            print('체력: {0}'.format(self.pow))
            print('생각: {0}'.format(self.think))
            print('요금: {0}$'.format(self.pay))
    
    # Student object 생성      
    peo1 = Student()
    print('Student : ')
    
    # Student object 실행
    peo1.charecter(30, 10, 'A')
    
    print()
    
    # Driver object 생성
    peo2 = Driver()
    print('Driver : ')
    
    # Driver object 실행
    peo2.charecter(10, 10, 5)
    
    
    # >> Student : 
    # >> 체력: 30
    # >> 생각: 10
    # >> 성적: A
    #
    # >> Driver :
    # >> 체력: 10
    # >> 생각: 10
    # >> 요금: 5$

    継承性


    継承とは、既存の親(부모클래스)に基づいて、子(자식클래스)を再定義することができる.
    継承によりコードの重複を回避できます.
    たとえば、「人」という名前の親を持つ場合は、学生とサラリーマンの子を継承できます.

    継承例

    class Person():
        def __init__(self, name, age):
            self.name = name
            self.age = age
        
        def print_me(self):
            print(f'My name is {self.name} and {self.age} years old')
    
    class Student(Person):
        def __init__(self, name, age, score):
            Person.__init__(self, name, age) # Person 상속
            self.score = score
        
        def print_score(self):
            print(f'My score is {self.score}$')
        
    class Employee(Person):
        def __init__(self, name, age, pay):
            Person.__init__(self, name, age) # Person 상속
            self.pay = pay
        
        def print_pay(self):
            print(f'My pay is {self.pay}$')
    
    p = Person('Mark', 21)
    s = Student('Jason', 18, 'A')
    e = Employee('Brown', 32, 120)
    print('Person:')
    p.print_me()
    print('Student:')
    s.print_me()
    s.print_score()
    print('Employee:')
    e.print_me()
    e.print_pay()
    
    # >> Person:
    # >> My name is Mark and 21 years old
    # >> Student:
    # >> My name is Jason and 18 years old
    # >> My score is A
    # >> Employee:
    # >> My name is Brown and 32 years old
    # >> My pay is 120$
    継承に似た概念は,他のクラス部分の機能を再利用する含む概念も存在する.

    例を含める

    class Bill():
        def __init__(self, description):
            self.description = description
    
    
    class Tail():
        def __init__(self, length):
            self.length = length
    
    
    class Duck():
        def __init__(self, bill, tail):
            self.bill = bill
            self.tail = tail
    
        def about(self):
            print(
                f"This duck has a {self.bill.description} and a {self.tail.length}.")
    
    duck = Duck(Bill('White'), Tail('Black'))
    
    duck.about()
    
    # >> This duck has a White and a Black.

    たけいせい


    実装されたサブクラス(자식클래스)に従って、クラスは異なる処理を行う.
    継承は継承と似ていますが、継承は親の機能(関数、変数)を再利用します.しかし多形性は上位クラスの機能を変え,(재사용하지 않는다.)を用いた.

    多形の例

    class Person():
        def __init__(self, name, age):
            self.name = name
            self.age = age
    
        def print_me(self):
            print(f"Person : My name is {self.name} and {self.age} years old.")
    
    class Student(Person):
        def __init__(self, name, age, score):
            Person.__init__(self, name, age)
            self.score = score
        
        def print_me(self):
            print(f"Student : My name is {self.name} and {self.name} years old. Score is {self.score}")
    
    class Employee(Person):
        def __init__(self, name, age, pay):
            Person.__init__(self, name, age)
            self.pay = pay
        
        def print_me(self):
            print(f"Employee : My name is {self.name} and {self.age} years old. Pay is {self.pay}$")
    
    
    p = Person('Andrew', 23)
    s = Student('Brown', 18, 'B+')
    e = Employee('Charlie', 30, 520)
    
    p.print_me()
    s.print_me()
    e.print_me()
    
    # >> Person : My name is Andrew and 23 years old.
    # >> Student : My name is Brown and Brown years old. Score is B+
    # >> Employee : My name is Charlie and 30 years old. Pay is 520$