オブジェクト向けプログラミング(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
抽象
複雑な内容の核心概念と機能を要約する.
抽象化は,具体的な事物間の共通点をとり,差異の一般化を捨てること,あるいは重要な部分を強調するために,不要な細部を取り除き,簡単にすることである.
ウサギやカメのような対象があるとすれば、これらの対象は動物の概念として抽象化することができる.
対象を表す単語.例えば、人も物も客体と呼ぶことができます.同じ人や物事でも、顔が少し違うので客体といえます.
クラス(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
抽象
複雑な内容の核心概念と機能を要約する.
抽象化は,具体的な事物間の共通点をとり,差異の一般化を捨てること,あるいは重要な部分を強調するために,不要な細部を取り除き,簡単にすることである.
ウサギやカメのような対象があるとすれば、これらの対象は動物の概念として抽象化することができる.
クラスを使用するには、まずクラスタイプのオブジェクト(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
抽象
複雑な内容の核心概念と機能を要約する.
抽象化は,具体的な事物間の共通点をとり,差異の一般化を捨てること,あるいは重要な部分を強調するために,不要な細部を取り除き,簡単にすることである.
ウサギやカメのような対象があるとすれば、これらの対象は動物の概念として抽象化することができる.
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本あり、しっぽがあります.
이외에 토끼는 큰 귀가 있다, 거북이는 등껍질이 있다 등 세부사항 제거
(상위 클래스)
となり,継承後個別のウサギ,亀類(하위클래스)
を生成する.抽象化の例
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$
Reference
この問題について(オブジェクト向けプログラミング(OOP)オブジェクト向けプログラミング(Python)), 我々は、より多くの情報をここで見つけました https://velog.io/@rsj9987/OOP-Object-Oriented-Programming-객체-지향-프로그래밍Pythonテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol