클래스란 관련된 함수와 변수의 모음으로써 "객체"의 구조와 행동을 정의하는 틀이다.
클래스는 class 키워드를 사용하여 작성할 수 있다.
class Book: #클래스의 네이밍 컨벤션은 CamelCase를 사용.
pass; #실행할 코드가 없다는 것을 의미
help(Book);
>>Help on class Book in module __main__: #help함수를 통해 Book이라는 클래스가 생성된걸 알 수 있다.
class Book(builtins.object)
| Data descriptors defined here:
|
| __dict__
| dictionary for instance variables (if defined)
|
| __weakref__
| list of weak references to the object (if defined)
Process finished with exit code 0
사용자는 클래스 내부에 함수를 정의해 객체의 "행동"을 정의할 수 있다.
(클래스 내부의 함수를 메서드라고 한다.)
class Book:
def read_book(self): #함수와 다르게 메서드는 항상 첫번째 매개변수로 self를 정의. self는 객체 자신을 의미.
return "reading....";
x = Book();
print(Book.read_book(x)); #Book의 메서드 사용에 객체 x를 인자로 전달해서 사용
print(x.read_book()); #간편하게 x객체와 . 으로 메서드 사용가능
>>reading....
>>reading....
클래스가 객체의 구조와 행동을 정의하는 틀이라고 했으니 이제 클래스의 "생성자"통해 객체를 생성해 보겠다.
class Book:
pass;
x=Book(); #클래스명() 으로 객체 생성 (타 언어와 다르게 new 키워드가 없다.)
print(isinstance(x,Book)); #isinstance(a, b)는 a가 b의 객체이면 True를 반환해주는 함수
>>True
※ Python의 모든 타입(사용자가 생성한 클래스 포함)은 Object 클래스를 상속받는다.
(모든 타입은 Object 클래스의 모든 속성을 가지고 있고 재정의할 수 있다.)
class Book:
pass;
print(isinstance(Book,object));
print(isinstance(str,object));
>>True
>>True
class Book:
pass;
print(dir(Book));
print(dir(object));
>>['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__']
>>['__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']
#Book클래스의 __dict__, __weakref__, __module__을 제외하고 모두 같은 것을 볼 수 있다.
클래스 내의 변수는 객체변수와 클래스 변수로 나뉜다.
객체 변수란 각 객체마다 가지고 있는 고유한 변수로서 다른 객체로부터 영향을 받지 않는 변수이다.
클래스 변수는 클래스로 만든 모든 객체들끼리 공유하는 변수이다.
객체 변수를 생성하기 위해서는 object 클래스로부터 상속받은 __init__ 메서드를 재정의 하면 된다.
class Book:
def __init__(self,name:str,number:int): #매개변수로 초기화할 값 전달받는다.
self._name=name; #self를 이용해 객체변수 생성 및 초기화
self._number=number;
x=Book("Python Book","1234");
y=Book("C++ Book","5678");
y._name="Java Book";
print(x._name);
print(y._name);
>>Python Book #y객체를 생성,변경해도 x객체의 객체변수는 바뀌지않는다.
>>Java Book
클래스 변수를 생성하기 위해서는 메서드와 같이 class 키워드 내에 변수를 생성하면 된다.
class Book:
name="Python Book";
x=Book();
y=Book();
print(x.name); #모든 객체가 클래스변수를 공유하는 것을 볼 수 있다.
print(y.name,end='\n\n');
Book.name="Java Book"; #<클래스명>.<클래스변수>를 변경(모든 객체의 클래스변수 변경)
print(x.name);
print(y.name,end='\n\n');
x.name="C++ Book"; #<객체명>.<클래스변수>변경(해당 객체의 클래스변수 변경)
print(x.name);
print(y.name,end='\n\n');
>>Python Book
>>Python Book
>>Java Book
>>Java Book
>>C++ Book
>>Java Book
Python은 생성자로 객체 생성을 호출받으면 먼저 __new__를 호출하여 객체를 생성할당하고, __new__메서드가 __init__메서드를 호출하여 객체에서 사용할 초기값들을 초기화하게 된다.
출처: wikidocs.net |
object클래스의 __str__메서드를 재정의하여 print함수를 이용했을 때의 출력 형식을 바꿀 수 있다.
class Book:
def __init__(self,name:str,number:int):
self._name=name;
self._number=number;
x=Book("Python Book","1234");
print(x);
>><__main__.Book object at 0x000001B105CC8A90>
class Book:
def __init__(self,name:str,number:int):
self._name=name;
self._number=number;
def __str__(self):
return "Name:{}\nNumber:{}".format(self._name,self._number);
x=Book("Python Book","1234");
print(x);
>>Name:Python Book
Number:1234
위와 같이 생성자와 메서드 정의, 메서드 재정의를 통해 클래스를 정의하고 객체를 생성할 수 있다.
복잡한 구조의 프로그램일수록 클래스를 많이 사용하여 불필요한 코드를 줄이고 가독성을 높이자.
'Python' 카테고리의 다른 글
Python - 함수 인자의 개수를 알 수 없을 때 (0) | 2020.08.11 |
---|---|
Python - 예외처리 (0) | 2020.08.10 |
Python - 컬렉션 정리 (0) | 2020.08.04 |
Python - 딕셔너리 키(key), 값(value) 도치 (0) | 2020.08.04 |
Python - with 문 (0) | 2020.08.01 |