객체는 개념 , 인스턴스는 만들어진 객체
class Person():
# 클래스 변수
cnt = 0
def __init__(self,name):
self.name = name
# 클래스 변수를 하나씩 증가 하고 싶을 땐?
Person.cnt +=1 # 클래스 변수 접근 방법
jonghyun = Person('종현')
# 인스턴스 변수
jonghyun.cnt=3
클래스 변수와 인스턴스 변수의 차이?
클래스 변수는 공용, 인스턴스 변수는 독립적
class Person():
# 클래스 변수
cnt = 0
def __init__(self,name):
self.name = name
# 클래스 변수를 하나씩 증가 하고 싶을 땐?
Person.cnt +=1 # 클래스 변수 접근 방법
def run(self):
print('뛰어!')
#self로 아무것도 하지 않을 때에는 staticmethod로 설정
#self.run = True
jonghyun = Person('종현')
# 인스턴스 변수
jonghyun.run()
>>>
뛰어!
클래스가 사용할 메소드
@classmethod로 정의
from datetime import datetime as dt
#꾸며질 함수를 매개변수로 받고
def time_display_decorator(origin_func):
#안에 함수를 정의
def decorated():
print(dt.now())
origin_func()
print('------')
#함수를 꼭 리턴 해줘야 한다
#return을 안할 시에, NoneTypeError 나온다
return decorated
@time_display_decorator
def test_a():
print('test_a')
@time_display_decorator
def test_b():
print('test_b')
test_a() #time_display_decorator(test_a)()
*깊은내용
데코레이터는 1급 객체와 연관 되어 있다.
from datetime import datetime as dt
def time_display_decorator(origin_func):
def decorated():
print(dt.now())
origin_func()
print('------')
return decorated
# 심화
# 클래스로 데코레이터를 정의 할수도 있음
class TimeDisplay():
def __init__(self,origin_func):
self.origin_func = origin_func
def __call__(self):
print(dt.now())
self.origin_func()
print('--------')
@time_display_decorator
def test_a():
print('test_a')
@TimeDisplay
def test_b():
print('test_b')
test_a()
test_b()
class Person():
# 클래스 변수
cnt = 0
def __init__(self,name):
self.name = name
# 클래스 변수를 하나씩 증가 하고 싶을 땐?
Person.cnt +=1 # 클래스 변수 접근 방법
#인스턴스 메소드
def run(self):
print('뛰어!')
self.run = True
#클래스 메소드
#첫번째 인자로 클래스를 넘겨줌
@classmethod
def plus(cls):
cls.cnt +=1
#클래스 변수 사용시, 인스턴스를 만들지 않아도 된다.
print(Person.cnt)
Person.plus()
print(Person.cnt)
>>>>
0
1
class Person():
# 클래스 변수
cnt = 0
def __init__(self,name):
self.name = name
# 클래스 변수를 하나씩 증가 하고 싶을 땐?
Person.cnt +=1 # 클래스 변수 접근 방법
# 클래스 메소드
# 첫번째 인자로 클래스를 넘겨줌
@classmethod
def plus(cls):
cls.cnt +=1
# static메소드
# 클래스 , 인스턴스와 관계가 없다
@staticmethod
def run():
print('뛰어!')
#클래스 변수 사용시, 인스턴스를 만들지 않아도 된다.
print(Person.cnt)
Person.plus()
print(Person.cnt)
Person.run()
>>>
0
1
뛰어!
속성과 메소드를 묶는 작업
'은닉성' -> 접근에 대한 권한
접근 제어자 종류
Public : 공개
Protected : 상속 관계 클래스 안 에서만 접근 가능
Private : 내 클래스 안에서 만 가능
class Person:
def __init__(self,age):
self.__age = age
def get_age(self):
return self.__age
tony = Person(27)
print(tony.__age)
>> 에러
print(tony.get_age())
>> 27
###################################
class Person:
def __init__(self,age):
self.__age = age
def get_age(self):#public method
return self.__age #private value
def set_age(self): #public method
self.__age += 1
tony = Person(27)
print(tony.get_age())
tony.set_age()
print(tony.get_age())
>>
27
28
private value 에 접근을 하려면, public method를 통해 접근 해야 한다.
#name mangling을 통해 변화된 private에 접근하는법
print(tony._Person__age)
#이렇게 쓰면 안됨
getter , setter
class Person:
def __init__(self):
self.__age = None
self.__name = None
#getter 메소드 : 뭔가를 주는거
def get_age(self):
return self.__age
#setter 메소드 : 뭔가를 설정,할당 함
def set_age(self,new_age):
self.__age = new_age
@property #getter
def name(self): #getter
return self.__name
@name.setter #setter
def name(self, new_name): #setter
self.__name = new_name
jonghyun = Person()
jonghyun.set_age(24)
#이런 형식으로 안 써도 된다.
#jonghyun.get_name('jonghyun')
jonghyun.name = 'Jonghyun'
print(jonghyun.name)
>>> Jonghyun
jonghyun.name = 'JonghyunLEE'
#name을 변수의 이름처럼 쓸 수 있음
print(jonghyun.name)
>>> JonghyunLEE
---
```python
#매직 메소드
class Person:
def __init__(self):
self.__age = None
self.__name = None
#매직 메소드
def __str__(self):
return f'나이는 {self.name}살 이구요, 이름은 {self.name} 입니다!'
#getter 메소드 : 뭔가를 주는거
def get_age(self):
return self.__age
#setter 메소드 : 뭔가를 설정,할당 함
def set_age(self,new_age):
self.__age = new_age
@property
def name(self): #getter
return self.__name
@name.setter
def name(self, new_name): #setter
self.__name = new_name
jonghyun = Person()
jonghyun.set_age(24)
jonghyun.name = 'Jonghyun'
print(jonghyun.name)
jonghyun.name = 'JonghyunLEE'
print(jonghyun.name)
##__str__ 메소드로 인해 가능
print(jonghyun)
```