시리즈 이전글입니다.
2021/02/01 - [파이썬/주식 자동매매] - Python 키움API 자동매매프로그램 개발-23.Python 기초편 클래스(2) self, __init__
07.속성
속성(attribute)이란 클래스에서 가지고 있는 변수라고 간단히 생각하시기 바랍니다.
속성의 종류는 두 가지가 있는데 클래스 속성과 인스턴스 속성이 있습니다.
먼저 인스턴스 속성이 무엇인지부터 살펴보겠습니다.
인스턴스 속성이란 객체별로 가지고 있는 변수를 의미합니다.
하나의 클래스에서 생성하는 객체마다 각자 다른 변수를 갖기 위해서는 초기화 함수에서 설정해줄 수 있습니다.
class Robot:
def __init__(self, name):
print("robot 객체 {}(가) 만들어집니다.".format(name))
self.name = name
robot1 = Robot("첫로봇")
robot2 = Robot("둘째로봇")
위 코드의 생성자(__init__ )를 보면 name을 입력받아서 self.name에 저장하고 있습니다.
self.name에 저장했다는 것은 이제 객체별로 객체 생성시 전달받은 name을 따로 저장한다는 것을 의미하며 인스턴스 변수에 접근하는 방법은 함수를 사용하는 방법과 마찬가지로
객체에 점(.)을 찍고 변수명을 입력하면 됩니다.
객체명.속성명
robot1.name
그러면 Robot 클래스에 인스턴스 속성 name을 출력하는 함수를 추가해보도록 하겠습니다..
class Robot:
def __init__(self, name):
print("robot 객체 {}(가) 만들어집니다.".format(name))
self.name = name
def print_name(self):
print("제 이름은 {}입니다".format(self.name))
robot1 = Robot("첫로봇")
robot2 = Robot("둘째로봇")
robot1.print_name()
robot2.print_name()
robot1.print_name()과 robot2.print_name()을 통해 각자의 name을 출력한 결과는 다음과 같습니다.
제 이름은 첫로봇입니다
제 이름은 둘째로봇입니다
하나의 같은 설계도에서 만들어진 객체지만 self.name에 어떤 값을 전달하느냐에 따라서 인스턴스 속성 값을 바꿀 수 있었습니다.
다음으로 클래스 속성이란 생성된 객체별로 가지고 있었던 인스턴스 속성과는 반대로 같은 클래스에서 생긴 객체라면 공유하는 값입니다.
Robot 클래스를 통해 만들어진 객체의 수를 계산하기 위해
robot_total_count 라는 변수를 만들었습니다. 이 변수는 생성자 안에 넣지 않고 클래스의 시작부분에 넣었습니다.
class Robot:
robot_total_count = 0
def __init__(self, name):
print("robot 객체 {}(가) 만들어집니다.".format(name))
self.name = name
Robot.robot_total_count = Robot.robot_total_count+1
print("현재까지 생성된 로봇의 수:{}".format(Robot.robot_total_count))
def print_name(self):
print("제 이름은 {}입니다".format(self.name))
robot1 = Robot("첫로봇")
robot2 = Robot("둘째로봇")
이렇게 변수를 만들고 접근하는 방법은 클래스명.클래스속성명을 이용해 접근합니다.
예를 들어 robot_total_count 클래스 속성에 접근하려면 다음과 같이 사용합니다.
Robot.robot_total_count (O)
robot1.robot_total_count (X)
robot2.robot_total_count (X)
코드를 보면 Robot 클래스의 인스턴스가 생길 때마다 이 클래스 속성값이 1씩 증가하도록 했습니다. 코드를 실행해보면 다음처럼 클래스 차원에서 robot_total_count값을 보관하기 때문에 객체가 계속 생성되더라도 값을 유지하는 것을 알 수 있습니다.
만약 이 값을 인스턴스 속성으로 두었다면 객체가 생성될 때마다 새로운 값으로 할당되어 서로 다른 객체에서 공유되지 못할 것입니다.
robot 인스턴스 첫로봇이(가) 만들어집니다.
현재까지 생성된 로봇의 수:1
robot 인스턴스 둘째로봇이(가) 만들어집니다.
현재까지 생성된 로봇의 수:2
제 이름은 첫로봇입니다
제 이름은 둘째로봇입니다
08.인스턴스 확인
이렇게 클래스를 이용해 객체를 생성하는 방법에 대해서 배웠지만 사실 우리는 클래스, 객체에 대해 배우기 전부터 객체를 만들어 사용해왔습니다.
예를 들면 문자열(str)이나 리스트(list)의 사용이 그렇습니다.
str1 = "나는문자열"
print(type(str1))
list1 = [1, 2, 3]
print(type(list1))
이렇게 문자열과 리스트를 만들고 type을 출력하는 코드를 실행시켜보면
다음과 같은 출력 결과가 나옵니다.
<class 'str'>
<class 'list'>
위 결과는 str1과 list1이라는 변수는 str과 list의 인스턴스라는 뜻입니다.
무슨 말이냐면 str과 list는 사실 클래스이고 이를 담고 있는 변수 str1과 list1은 각각 str과 list의 인스턴스인 것입니다.
그러면 앞서 만든 Robot 클래스에서 객체 생성할 때는 다음처럼 클래스명을 이용했는데 왜 문자와 리스트는 객체라면서 클래스명 없이 생성할 수 있었냐고 하실 수 있을 것 같습니다.
robot1 = Robot("첫로봇")
str1 = "나는문자열"
list1 = [1, 2, 3]
그건 문자열과 리스트 같이 자주 사용하는 클래스들은 생성방법이 간소화되어 있어 가능한 것이며 이들도 원래는 클래스명을 이용해 객체를 생성할 수 있습니다.
# str1 = "나는문자열"
str1 = str("나는문자열")
print(type(str1))
# list1 = [1, 2, 3]
list1 = list([1, 2, 3])
print(type(list1))
이렇게 Python을 사용하며 마주칠 수 있는 클래스 사용에서 이 객체가 어느 클래스로부터 생성된것인지 확인하기 위해서는 내장함수 isinstance를 사용합니다.
isinstance(인스턴스, 클래스)
위의 예에서 str1이 str의 인스턴스인지 확인하기 위해서 다음과 같이 확인하며 함수의 결과는 참, 거짓으로 반환되기 때문에 저장해서 출력할 수 있습니다.
따라서 str1이 str 클래스를 통해 만든 인스턴스인지 확인하면 True가 나옵니다.
result = isinstance(str1, str)
print(result) # True
이번에는 str1이 list 클래스를 통해 만든 인스턴스인지 확인하면 False가 나옵니다.
result = isinstance(str1, list)
print(result) # False
마지막으로 robot1 객체가 Robot 클래스를 통해 만들었는지 확인하면 True가 나오는 것을 알 수 있습니다.
result = isinstance(robot1, Robot)
print(result) # True
같이 보시면 좋을 글
2021/02/10 - [파이썬/주식 자동매매] - 주식매매프로그램 개발 노하우, 소스를 담은 전자책이 발간되었습니다.
2021/02/03 - [파이썬/주식 자동매매] - Python 키움API 자동매매프로그램 개발-25.Python 기초편 클래스(4) 상속
'파이썬 > 주식 자동매매' 카테고리의 다른 글
Python 키움API 자동매매프로그램 개발-26.Python 기초편 모듈(1) import, from (0) | 2021.02.04 |
---|---|
Python 키움API 자동매매프로그램 개발-25.Python 기초편 클래스(4) 상속 (0) | 2021.02.03 |
Python 키움API 자동매매프로그램 개발-23.Python 기초편 클래스(2) self, __init__ (0) | 2021.02.01 |
Python 키움API 자동매매프로그램 개발-22.Python 기초편 클래스(1) 들여쓰기, 인스턴스화 (0) | 2021.01.31 |
Python 키움API 자동매매프로그램 개발-21.Python 기초편 함수(4)매개변수, 호출순서 (0) | 2021.01.31 |
댓글