class Car:
def __init__(self, maker, model, horse_power):
self.maker = maker
self.model = model
self.horse_power = horse_power
def start_up(self, key, fuel)
pass
def go(self, speed, direction):
pass
my_car = Car("Bentz", "좋은 모델", "5000")
class Car:
pass
# 위의 코드를 기준으로
my_car.go(20, "left")
class Car:
def __init__(self, maker, model, horse_power):
self.maker = maker
self.model = model
self.horse_power = horse_power
def start_up(self, key, fuel)
pass
def go(self, speed, direction):
self.start_up(10, "backward")
pass
my_car = Car("Bentz", "좋은 모델", "5000")
isinstance(instance, class) >> True, False
앞 뒤로 __ 가 붙은 메서드는 파이썬이 자동으로 호출해주는 메서드인데, 스페셜 메서드(special method) 또는 매직 메서드(magic method)라고 부른다.
self 는 인스턴스 자기 자신을 의미한다. 인스턴스가 생성된 후, 인스턴스를 사용하여 메서드를 호출하면, 현재 인스턴스가 자동으로 매개변수 self 로 들어온다.
class Person:
# james = Person() 이 self 로 들어옴
def __init__(self):
self.hello = "hi"
# james.greeting() 이 self 로 들어옴
def greeting(self):
print(self.hello)
james = Person()
james.greeting()
코드 출처: 코딩도장 파이썬 (https://dojang.io/mod/page/view.php?id=2373)
class class_name:
def __init__(self, 매개변수1, 매개변수2):
self.속성1 = 매개변수1
self.속성2 = 매개변수2
- 파이썬은 클래스 안에서 init 메서드를 한 번 밖에서 선언하지 못한다.
- init 메서드에 매개변수를 지정하면, 인스턴스를 생성할 때 반드시 값을 넣어줘야 한다.
- 빈 생성자와 같은 형태를 만드려면 init 메서드에 매개변수를 지정하지 않으면 된다 (추후 수정 할 수 있음)
클래스로 인스턴스를 만들 때 위치 인수와 키워드 인수를 사용할 수 있는데, 위치 인수와 리스트 언패킹을 사용하려면 *args 를 사용하고 args[0], args[1], args[2] 의 형태로 사용하면 된다.
class Wecoder:
def __init__(self, *args):
self.name = args[0]
self.group_number = args[1]
aaa = Wecoder(*['asdf', '14기'])
키워드 인수와 딕셔너리 언패킹을 사용하려면 다음과 같이 **kwargs를 사용하면 된다.
class Wecoder:
def __init__(self, **kwargs):
self.name = args["name"]
self.group_number = args["group_number"]
aaa = Wecoder(name="asdf", group_number="14기")
aaa = Wecoder({"name":"asdf", "group_number":"14기"})
class Wecoder:
pass
aaa = Wecoder() # 인스턴스 생성
aaa.name = "asdf" # 인스턴스를 만든 뒤 속성 추가
다만, 이러한 방식으로 추가한 속성은 해당 인스턴스에만 해당 된다. 클래스로 다른 인스턴스를 생성한다면 추가한 속성은 생성되지 않는다.
인스턴스는 생성한 뒤에 속성을 추가할 수 있으므로, __init__ 메서드가 아닌 다른 메서드에서도 속성을 추가할 수 있다.
자유롭게 속성을 추가할 수 있지만, 특정 속성만 허용하고 다른 속성은 제한하고 싶을 수 있다. 이럴 때 __slot__ 을 사용한다.
class Person:
__slot__ = ["name", "group_number"]
class 클래스이름:
def __init__(self, 매개변수)
self.__속성 = 값
self.__속성__ (xxxxx 이건 안됨)
__ 로 시작하는 속성은 private 속성을 부여받아, 클래스 바깥에서 instance.속성
으로 접근할 수 없다. (에러 발생: AttributeError: 'OOO' object has no attribute '속성 이름'
비공개 속성은 클래스 안의 메서드에서만 접근할 수 있다.
비공개 속성은 클래스 바깥으로 드러내고 싶지 않은 중요한 값이며, 바깥에서 함부로 바꾸면 안될 때 사용한다. (비공개 속성을 바꾸는 경우는 클래스의 메서드로 한정한다.)
class 클래스이름:
def __init__(self, 매개변수):
self.__속성 = 값
def hello(self, 매개변수):
self.__call_name()
def __call_name(self, 매개변수):
print(매개변수, end="")
class 클래스이름:
속성 = 값
def __init__(self):
공유
한다.self
도 가능하지만, self
는 인스턴스를 뜻하므로 클래스 속성을 지칭하기에는 모호하다. 따라서 클래스 자체의 이름을 사용한다.class Person:
bag = []
def put_bag(self, stuff):
Person.bag.append(stuff)
print(Person.bag)
인스턴스 속성
이라고 한다.클래스 속성
이라고 한다.클래스이름.속성
과 같은 형태로 접근하는 것을 약속으로 한다.class Person:
@staticmethod
def hello():
print("hello,")
Person.hello()
cls
로 클래스 속성에 접근할 수 있다.class 클래스이름:
@classmethod
def 메서드(cls, 매개변수1, 매개변수2):
코드
클래스이름
과 같다.정적 메서드 사용 예
class Date: @staticmethod def is_date_valid(date_string): year, month, day = map(int, date_string.split('-')) return month <= 12 and day <= 31 #- if Date.is_date_valid('2000-10-31'): print('올바른 날짜 형식입니다.') else: print('잘못된 날짜 형식입니다.')
클래스 메서드 사용 예
class Time: def __init__(self, hour, minute, second): self.hour = hour self.minute = minute self.second = second # @staticmethod def is_time_valid(time_string): time = list(map(int, time_string.split(":"))) return time[0] <= 24 and time[1] <= 59 and time[2] <= 60 # @classmethod def from_string(cls, time_string): time = list(map(int, time_string.split(":"))) return cls(time[0], time[1], time[2]) # time_string = input() # if Time.is_time_valid(time_string): t = Time.from_string(time_string) print(t.hour, t.minute, t.second) else: print('잘못된 시간 형식입니다.')
class 부모 클래스:
pass
class 자식 클래스(부모 클래스):
pass
issubclass()
class Person:
def __init__(self):
print('Person __init__')
self.hello = '안녕하세요.'
class Student(Person):
def __init__(self):
print('Student __init__')
super().__init__() # super()로 기반 클래스의 __init__ 메서드 호출
self.school = '파이썬 코딩 도장
super().메서드명()
으로 부모 클래스의 메서드를 호출하면, 원래의 기능을 유지하면서 새로운 기능을 덧붙일 수 있다.클래스.mro()
파이썬 3에서 모든 클래스는 object 클래스를 상속받으므로 기본적으로 object를 생략한다.
class X:
pass
class X(object):
pass
메서드의 목록만 가진 클래스이며 상속받는 클래스에서 메서드 구현을 강제
하기 위해 사용된다.
from abc import *
class 추상클래스이름(metaclass=ABCMeta):
@abstractmethod
def 메서드이름(self):
pass
36.8 연습문제: 리스트에 기능 추가하기
https://dojang.io/mod/page/view.php?id=2391
위 링크를 보고 기억 안날 때 마다 찾아보기
내용은 list 클래스를 상속받아서 replace 함수를 오버라이딩하는 내용이다.
업데이트 예정