알고리즘

파이썬(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()