위와 같기에 어느 함수에서든 값을 조정한다면 모든 위치의 변수의 값이 변하는 것이다.
별개로 지역변수는 가장 가까운 변수를 가져와서 해당 위치의 함수가 종료되면 지역변수 역시 종결된다.
객체와 인스턴스의 차이는 클래스와 연관되면 인스턴스라 불린다. 하등 크게 다른 의미는 아니다.
클래스에서 객체 초기화를 하는 경우가 많다.
그때 사용하는 것은 아래와 같다.
class 클래스명:
def __init__(self, a, b): #해당 코드는 외우는거 추천 self는 필수적으로 필요하며 init은 대부분 필요하다 없다면 일반 함수와 다를바 없으니.
self.a = a
self.b = b
해당 코드처럼 a 와 b를 받아와서
self.a와 self.b에 넣는다 이 말은 즉슨
만약 내가 클래스를 인스턴스로 받으면
maria = class()
여기서 self는 maria 자기 자신을 뜻하고
maria의 a에 입력값 a를 넣고
maria의 b에 입력값 b를 넣는다는 뜻.
추가적으로 클래스는 메서드와 속성을 가진다.
그중 먼저 알아볼 것은 메서드인데
앞서 배웠다시피 함수를 뜻하는 메서드와 동일하다. 단지 파라미터에 self를 가지고 있을 뿐이다.
메서드 ex)
class knight:
def __init__(self, health, mana, armor):
self.health = health
self.mana = mana
self.armor = armor
def slash(self):
print("베기")
x = knight(health=542.4, mana=210.3, armor=38)
print(x.health, x.mana, x.armor)
x.slash()
# 이런식으로 되면 원하는 결과가 나오지 않는다.
class Person:
bag = [] #클래스 속성은 공유되는 변수로 해당 person내의 지역변수이다. 클래스는 함수와 달리 호출 후 끝나는 객체가 아니라서 메모리를 계속 가지고 있다
def put_bag(self, stuff):
#self.bag.append(stuff) 해당 코드도 돌아가지만 bag은 공용인 bag이므로 인스턴스가 아니라 person의 객체가 더 옳은 표현
Person.bag.append(stuff)
james = Person()
james.put_bag('책')
maria = Person()
maria.put_bag('열쇠')
print(james.bag) #클래스 내의 변수 호출 하지만 james의 가방과 maria의 가방은 Person 클래스 내에서 공유되고 있다.
print(maria.bag)
class Person:
def __init__(self):
self.bag = []
def put_bag(self, stuff):
self.bag.append(stuff)
james = Person()
james.put_bag('책')
maria = Person()
maria.put_bag('열쇠')
print(james.bag) #바꾼 코드는 init으로 개인용 가방을 만든 것이다. 이로써 공유되던 가방이 각자에게로 주어지게 되었다
print(maria.bag)
속성에 접근할때는 클래스명.속성명 으로 접근하는게 옳다
비공개 객체와 속성은
클래스 외부에서 접근 불가능하고 내부에서만 접근이 가능하다
따라서 직접적인 호출은 불가능하다.
#비공개 객체의 예
class person:
def __init__(self, name, age, address, wallet): #self는 무조건 받아야하는 인자이며 추가적인 인자를 받아서 초기화 할 수 있다. 구조체 용도?
self.hello = '안녕하세요'
self.name = name
self.age = age
self.address = address
self.__wallet = wallet #비공개 속성은 __를 붙여야함 #오류가 나는데 갑 변경도 안되고 호출도 안된다
def greeting(self):
print('{0}, 저는 {1}입니다.'.format(self.hello, self.name))
def pay(self, amount):
self.__wallet -= amount
print('{}는 지갑에 {}원이 남았습니다.'.format(self.name, self.__wallet))
maria = person('마리아', 20, '서초구 반포동', 10000)
maria.greeting()
maria.pay(3000)
print('\n이름 : {0}'.format(maria.name))
print('나이 : {0}'.format(maria.age))
print('주소 : {0}'.format(maria.address))
#maria.__wallet -= 1000 #오류가 나는데 갑 변경도 안되고 호출도 안된다 하지만 클래스 안의 메소드에서는 사용 가능
이런식으로 pay에서는 접근이 가능하지만.
맨 아래의 주석과 같이 클래스.비공개객체식으로 호출하려고 하면 불가능
위와 동일하게 속성이지만 비공개로 만들어진 속성이다.
접근 방식마저 위와 동일
@staticmethod 를 앞에 붙이는 정적 메서드는 일반 함수와 동일하게 사용가능하다 self인자도 필요없다. 이때 객체나 속성에 접근하려하면 define 오류가 나온다.
@ classmethod 를 앞에 붙이는 클래스 메서드는 self인자는 필요없지만 대신 cls를 인자로 받는다. 추가적으로 클래스내의 속성과 객체에 접근 가능한 특징이 있다.