수업 내용이 이해가 전혀 안가서 플레이 데이터 프리코스 내용을 바탕으로 작성한 정리한 내용
객체(object);개념적 = 클래스내 메소드를 실체화 하는 것 = 인스턴스(instance); 특정 클래스와 연관지어 말할 때
메서드(method): 클래스 내 정의된 함수
self: 클래스 내 정의된 함수(method)의 첫 번째 파라미터(변수;인자). 파이썬이 알아서 넣어주는 값
= 인스턴스 자기 자신
클래스 내 모든 함수의 첫 번째 파라미터 = self
생성자 = (__init__): 클래스가 만들어질 때 최초에 단 한 번 호출되는 것.
인스턴스가 실체화될 때 최초에 한 번 수행되는 함수. 클래스 생성자 정의를 위한 함수
모든 클래스 첫 함수 = 생성자 정의 함수 __init__
클래스 속성(attribute)
def __init__(self):
self.속성 = "안녕하세요." # <- attribute에 "안녕하세요" 값 할당
클래스 속성 추가
def __init__(self, param1, param2):
self.attr1 = param1 # <- self에 attr1, attr2 (임의) 속성 추가 可.
self.attr2 = param2 # param은 값 할당
기초예제)
class Person: 반드시 언더바 양쪽 2개여야만 작동 可
def __init__(self): <- 생성자, 클래스 생성 시 최초 한 번 실행되는 파이선 특수 매소드
self.hello = "안녕하세요." <- 인스턴스 속성 hello로 추가하고(만들고), 그 값으로 "안녕하세요" 초기화
def greeting(self):
print(self.hello)
james = Person() <- 클래스를 인스턴스화(함수 실체화, 객체화) 하는 부분. 여기서 생성자 호출
-> james가 가진 메소드(함수): greeting
james.greeting() -> 안녕하세요.
작동원리: Person() -> 생성자의 self -> 인스턴트 속성 hello -> 부여된 "안녕하세요."
-> 이 전체가 james변수로 정의 -> greeting()이라는 메소드 호출
클래스 속성 추가(생성자에 파라미터 추가) 된 예제
class Person2:
def __int__(self, name, age, address):
self.hello = "안녕하세요." # 좌변 = class field(=attribute) 필드
self.name = name # 우변 = __init__()의 parameters.
self.age = age
self.address = address
def greeting(self):
print(f"{self.hello} 제 이름은 {self.name}입니다." )
# 여러 변수 있으면 변수지정시 self 외 모든 파라미터 꼭 넣어야 함!
maria = Person2("마리아", 20, "서울시 서초구 반포동")
maria.greeting()
안녕하세요. 제 이름은 마리아입니다.
print(f"이름: {maria.name}")
print(f"나이: {maria.age}")
print(f"주소: {maria.address}")
이름: 마리아
나이: 20
주소: 서울시 서초구 반포동
비공개 속성: 쉽게 파라미터를 할당(인스턴스 속성 수정) 못하게 코드짜기
앞선 예제에서
class Person2:
def __int__(self, name, age, address):
self.hello = "안녕하세요." <- 좌변 = class field(=attribute), 우변 = __init__()의 parameters.
self.__name = name <- 던더(double under; dounder) 삽입
-> 이 경우 class 내부에서 지정해야만 반영됨. 기존엔 밖에서 self.attr = 속성 그냥 입력해도 반영 可
ex) 예제
class Person3:
def __int__(self, name, age, address, wallet):
self.hello = "안녕하세요." <- 좌변 = class field(=attribute), 우변 = __init__()의 parameters.
self.name = name
self.age = age
self.address = address
self.__wallet = wallet
def greeting(self):
print(f"{self.hello} 제 이름은 {self.name}입니다." )
hong = Person3("홍길동", 18, "서울시", 10000)
이떄 그냥 hong.__wallet 입력시, 오류 발생(비공개 속성)
ex) 비공개 속성은 class내에서만 사용 可
class Person3:
def __int__(self, name, age, address, wallet):
self.hello = "안녕하세요." # 좌변 = 클래스 필드, 우변 = init의 파라미터
self.name = name
self.age = age
self.address = address
self.__wallet = wallet
def pay(self, amount):
if amount > self.__wallet:
return print("돈이 부족합니다.")
self.__wallet -= amount
print(f"이제 {self.__wallet}원 남았네요.")
def greeting(self):
print(f"{self.hello} 제 이름은 {self.name}입니다." )
hong = Person3("홍길동", 18, "서울시", 10000)
hong.pay(3000)
이제 7000원 남았네요.
Object oriented(객체지향) = 큰 문제를 잘게 나눠(객체로) 그 작은걸 조합해서 문제 해결하는 방식.
-> 큰 프로젝트 유지보수 방법
객체 기능 = 매서드(method)
객체 데이터 = 클래스 속성(attribute)
클래스 = 사용자 정의 객체 설계도
Ex) 자동자와 그 데이터 변수
자동차: 바퀴 4개(속성) , 색상(속성), 가속페달시 차가 앞으로 가는 특성(메소드)
sunroof(특성)이 있다.
wheels =4
color = "white"
acc = lambda x: "차가 앞으로 갑니다." if x else "차가 멈춰있습니다." <-이걸 일일이 수정하고 추가하기 번거로움
이런 구조를 한번에 수정하고 설계를 위한 것이 클래스
(파이썬처럼 자동상속개념은 java에 없습니다.)
클래스 상속: 기존 클랙스(부모클래스) 확장 by 새 클래스(자식 클래스), 재사용(코드중복줄임) 방법 -> 유지보수 용
방법 Ex) class 부모클래스: <- 정의 후
class 자식클래스(부모클래스): <- 이러면 상속됨 (자식 클래스는 모든 부모클래스 사용 可)
Ex)
class Character: <- parent class
def __init__(self, name, health):
self.name = name
self.health = health
def attack(self):
print(f"{self.name}이(가) 공격합니다!")
class Warrior(Character): <- 자식 클래스 1
def __init__(self, name, health, strength): <- strength 추가
super().__init__(name. health) <-super()로 부모 클래스 init 호출
self.strength = strength
def attack(self):
super().attack()
print(f"{self.name}의 강력한 공격!")
class Mage(Character): <- 자식 클래스 2
def __init__(self, name, health, magic_power): <- magic_power 추가
super().__init__(name, health)
self.magic_power = magic_power
def attack(self):
super().attack()
print(f"{self.name}의 마법 공격!")
=========================================== 클래스 설정 끝
player1 = Warrior("전사", 100, 10)
player2 = Mage("마법사", 80, 15)
player1.attack()
전사이(가) 공격합니다!
전사의 강력한 공격!
player1.name -> '전사'
player1.strength -> 10
player2.attack()
마법사이(가) 공격합니다!
마법사의 마법 공격!
========================수업 문제풀이 중에서..
'Programming > Python' 카테고리의 다른 글
[python] 문자열 편집, 절대경로 상대경로, 데이터 읽고 처리 (1) | 2023.08.21 |
---|---|
[Python] 모듈, package, random (0) | 2023.08.18 |
[Python] format(), readline(), with as, function, class (0) | 2023.08.17 |
[Python] set, dict, If, for, while (0) | 2023.08.16 |
[Python] 기본 연산, 변수, 리스트, 튜플, range (0) | 2023.08.14 |