알고리즘
파이썬(2) - 객체지향프로그래밍
SolartheNomad
2023. 6. 26. 01:11
객체 지향 프로그래밍
- 객체들과 객체들의 사이의 관계를 정의하는 프로그래밍
- 객체에서 속성은 변수로 나타내고 행동은 함수로 나타낸다. 클래스 안에 함수를 정의하게 되면 행동을 저의하는 것이고, 이 함수를 메서드라고 한다.
인스턴스
- 클래스를 변수로 받아옴
class User:
pass
//세 개의 인스턴스 객체
user1 = User()
user2 = User()
user3 = User()
인스턴스 변수 정의하기
- 인스턴스에 속성을 부여해주기
- 인스턴스 객체가 각자 가지게 되는 속성
인스턴스 이름.속성이름(인스턴스변수) = "속성에 넣을 값"
예시
user1.name = "solarthenomad"
user1.email = "solarthenamd@gmail.com"
user1.password = "12345"
user2.name = "solarthenomad"
user2.email = "solarthenamd@gmail.com"
user2.password = "12345"
user3.name = "solarthenomad"
user3.email = "solarthenamd@gmail.com"
user3.password = "12345"
메서드
인스턴스 메서드
- 인스턴스 변수를 사용하거나 인스턴스 변수에 값을 설정하는 메서드이다.
class User :
#인스턴스 메서드 만들기
def say_hello(some_user): #some_user : 인스턴스 객체들
#인사 메세지 출력 메서드
print("안녕하세요! 저는 {}입니다.format(some_user.name)")
#인스턴스 메서드 만들기
def login(some_user , my_email, my_password):
#로그인 메서드 만들기
if (some_user.email == my_email and some_user.password == my_password):
print("로그인 성공, 환영합니다.")
else :
print("로그인 실패, 없는 아이디임")
User.say_hello(user1) #사용할 클래스 이름도 작성해주어야 함
User.say_hello(user2)
user1.say_hello()
user1 = User()
user1.name = "solar"
user1.email = "solar@gmail.com"
user1.login(user1, "solar@gmail.com", "12345") #오류 출력
user1.login("solar@gmail.com", "12345") #정답
인스턴스 메서드 사용 형식
클래스이름.메서드이름(인스턴스)
인스턴스이름.메서드이름()
self
- 인스턴스 자기 자신을 호출할 때
- 인스턴스 메서드의 첫 번째 파라미터의 이름은 꼭 self로 작성해주어야 한다.
class User :
#인스턴스 메서드 만들기
def say_hello(self): #some_user : 인스턴스 객체들
#인사 메세지 출력 메서드
print("안녕하세요! 저는 {}입니다.format(some_user.name)")
#인스턴스 메서드 만들기
def login(self , my_email, my_password):
#로그인 메서드 만들기
if (self.email == my_email and self.password == my_password):
print("로그인 성공, 환영합니다.")
else :
print("로그인 실패, 없는 아이디임")
User.say_hello(user1) #사용할 클래스 이름도 작성해주어야 함
User.say_hello(user2)
user1.say_hello()
user1 = User()
user1.name = "solar"
user1.email = "solar@gmail.com"
user1.login(user1, "solar@gmail.com", "12345") #오류 출력
user1.login("solar@gmail.com", "12345") #정답
__init__메서드
- 인스턴스가 생성될 때 자동으로 호출되는 메서드
magic method
- __ __이런 형태의 메서드
- 특수 상황에서 자동으로 호출되는 메서드
예시
class User(self):
def __init__(self, name, email, password):
self.name = name
self.email = email
self.password = password
#User 인스턴스 생성과 동시에 __init__메서드 자동 호출
user1 = User()
user1 = User("solar", "solar@gmail.com", "12345")
__str__메서드
-
예시
class User:
def __init__(self, name, email, pw):
#유저 인스턴스의 모든 변수를 지정해주는 메서드
self.name = name # 위에서 받아온 name을 새로 생성한 self.name의 값에 저장
self.email = email # 위에서 받아온 email을 새로 생성한 self.email의 값에 저장
self.pw = pw
def say_hello(self):
print("안녕하세요! 저는 {}입니다.".format(self.name))
def __str__(self):
return "사용자 : {}, 이메일 : {}, 비밀번호 : ******".format(self.name, self.email, self.pw)
user1 = User("solar", "solar@gmail.com", "1234567")
user2 = User("solar", "solar@gmail.com", "1234567")
클래스 변수
- 같은 속성의 인스턴스들이 서로 공유하는 값
예시
class User:
count = 0
def __init__(self, name, email, pw):
#유저 인스턴스의 모든 변수를 지정해주는 메서드
self.name = name # 위에서 받아온 name을 새로 생성한 self.name의 값에 저장
self.email = email # 위에서 받아온 email을 새로 생성한 self.email의 값에 저장
self.pw = pw
#클래스 변수 count가 유저 인스턴스 개수를 정확히 나타나게 하기 : User가 생성될 때마다 count를 증가시키면 됨!
# 즉, __init__메서드가 호출될 때마다 count 증가시키기
User.count +=1
#클래스 변수 정의하기
User.count = 1
print(User.count)
#클래스 변수 count가 유저 인스턴스 개수를 정확히 나타나게 하기 : User가 생성될 때마다 count를 증가시키면 됨!
예시2
class User:
count = 0
def __init__(self, name, email, pw):
#유저 인스턴스의 모든 변수를 지정해주는 메서드
self.name = name # 위에서 받아온 name을 새로 생성한 self.name의 값에 저장
self.email = email # 위에서 받아온 email을 새로 생성한 self.email의 값에 저장
self.pw = pw
#클래스 변수 count가 유저 인스턴스 개수를 정확히 나타나게 하기 : User가 생성될 때마다 count를 증가시키면 됨!
# 즉, __init__메서드가 호출될 때마다 count 증가시키기
User.count +=1
#인스턴스생성
user1 = User("solar", "solar@gmail.com", "12345")
user2 = User("solar", "solar@gmail.com", "12345")
user3 = User("solar", "solar@gmail.com", "12345")
#3 결과나옴
user1.count = 5 #얘는 위의 클래스 변수가 아니라 인스턴스 변수를 생성하게 된다. : 즉 self.count라는 친구를 생성해주는 것
User.count = 5 #5로 모두 출력된다.
데코레이터
- 기존 함수를 꾸며서 새로운 함수를 꾸밈
def print_hello():
print("안녕하세용")
def add_print_to(original): #original = print_hello
def wrapper(): # 함수 내에서 함수를 정의 : 데코레이터 함수
print("함수 시작")
original()
print("함수 끝")
return wrapper #내부 함수를 return함
add_print_to(print_hello)()
print = add_print_to(print_hello)
print(print)
def add_print_to(original):
def wrapper():
print("함수 시작")
original)
print("함수 끝")
@add_print_to
def print_hello():
print("안녕하세요!")
print_hello = add_print_to(print_hello)
print_hello()