Networks/Python

SK networks AI Camp - Python(Class_보충)

코딩하는 Español되기 2024. 7. 17. 08:00

이전 Class 부분에서 부족한 부분이 있어서 따로 포스팅합니다!

2024.07.15 - [컴퓨터 공학/Networks] - SK networks AI Camp - Python(Class)

 

SK networks AI Camp - Python(Class)

클래스에 대해 설명하기 전에 배운 꿀팁!x = [1,2,3,4,5,6,7]for i in x: print(i)리스트를 for문으로 하나하나 출력하게 된다면 안 그래도 무거운 Python이기에 속도가 느려요.위의 코드와 결과는 같으면서

joowon582.tistory.com

Decorate부분이 부족해 보여서 설명을 더 적었습니다.

그 전에 Markdown 사용에 관해서 한 가지 더 할게요.

VS Code를 사용할 때 셀을 추가하는 것을 보면 Code와 Markdown 부분이 떠요.

그 부분에서 Markdown을 클릭하면 Markdown 형식으로 뜨게 돼요.

마크다운에서 코드 형식으로 입력해서 저장하려면 백쿼드(`)를 입력해줘야 해요.

백쿼드는 숫자 1 옆에 ~ 표시 버튼이에요. 쉬프트를 누르지 않고 1번 옆을 눌러주면 돼요.

백쿼드를 3개 입력하고 옆에 Python이든 Bash든 원하는 언어를 입력해 주세요.

```python

그리고 밑에 코드를 입력해 주시고 닫을 때 백쿼드를 3개 입력해 주세요.

그러면 아래와 같이 표시가 되고 제일 위의 사진처럼 적히게 돼요.


Decorate

아래 코드를 보면 def(함수)들의 함수명이 name으로 같아요. 파이썬에서는 이렇게 코딩하면 안 되지만

데코레이션으로 설정해 주면 변수명을 똑같이 설정이 가능해요.

@property라고 데코레이트를 적어주고 함수명을 name으로 했어요.

@(함수명). setter는 재정의를 해주는 기능을 해요.

그래서 아래 코드를 보면 다른 값으로 치환을 해주죠(self.__name = value)

@(함수명). deleter는 삭제를 해주는 기능을 해요.

그래서 아래 코드에 del을 사용해서 해당 객체에 대한 해당 변수(__name)가 사라지게 하는 기능을 넣었어요.

class Student:
    def __init__(self, name):
        self.__name = name

    @property # 함수들의 이름이 같다. 파이썬에서 안됨 그래서 데코레이션을 적은 것
    def name(self):
        return self.__name # Private라서 외부에서 접근할 수 없다.
    
    @name.setter # 재정의 기능
    def name(self, value):
        self.__name = value # 다른 값으로 치환(재정의)
    
    @name.deleter
    def name(self):
        print('Deleting...')
        del self.__name # 해당 객체에 대한 해당 변수(__name)가 사라지게 됨.

classmethod

아래 코드를 보면 @classmethod를 사용했어요. 그래서 class 메서드를 쓰게 되면 self(인스턴스, 객체)가 아니라 클래스가 들어가서 구분해 주려고 tostring(self)가 아니라 tostring(cls)로 적어줬어요.

class Student:
    name = 'unknown'
    def __init__(self, name):
        self.age = 20
        self.name = name

    @classmethod
    def tostring(cls):
        # class 메소드를 쓸거면 self(인스턴스, 객체)가 아니라 클래스가 들어가서 cls를 사용
        print(f'Student Class Attributes : name = {cls.name}') 
Student.tostring()

아래 코드를 보면 cls.age가 추가되었어요. 하지만 이렇게 하면 에러가 발생해요.

class는 위에 변수만 사용이 가능한데 name은 변수 선언이 되었지만, age 변수가 없기 때문에 오류가 발생해요.

class Student:
    name = 'unknown'
    def __init__(self, name):
        self.age = 20
        self.name = name

    @classmethod
    def tostring(cls):
        # class 메소드를 쓸거면 self(인스턴스, 객체)가 아니라 클래스가 들어가서 cls를 사용
        print(f'Student Class Attributes : name = {cls.name} age = {cls.age}') 
        # age를 하면 안됨 class는 위에 변수만 사용 가능한대 age가 변수 선언이 안되어있으니까 사용 불가
Student.tostring()

오류 코드를 보면 'Student' 객체가 'age' Attribute가 없다고 오류 메시지가 나오죠.

그래서 age 변수를 선언해 주면 잘 나와요.

class Student:
    name = 'unknown'
    age = 10
    def __init__(self, name):
        self.age = 20
        self.name = name

    @classmethod
    def tostring(cls):
        # class 메소드를 쓸거면 self(인스턴스, 객체)가 아니라 클래스가 들어가서 cls를 사용
        print(f'Student Class Attributes : name = {cls.name} age = {cls.age}') 
        # age를 하면 안됨 class는 위에 변수만 사용 가능한대 age가 변수 선언이 안되어있으니까 사용 불가
Student.tostring()


@staticmethod

staticmethod는 class 내에 선언된 메서드지만 class 내의 변수를 사용할 수 없어요.

class Student:
    name = 'unknown'
    def __init__(self, name):
        self.age = 20
        self.name = name

    @staticmethod
    def tostring(cls):
        # class 메소드를 쓸거면 self(인스턴스, 객체)가 아니라 클래스가 들어가서 cls를 사용
        print(f'Student Class Attributes : name = {cls.name}') 
        # Static 메소드는 class내 선언된 메소드지만 class 내의 변수를 사용할 수 없음

Student.tostring()


MagicMethod

아래와 같이 코딩을 했다고 볼게요.

class MyDataset:

    def __init__(self, data:list) -> None: # 클래스 객체화하는 함수
        self.data = data

    def __call__(self, name:str) -> int: # 객체를 함수처럼 사용하는 함수
        print(f'이름은 {name}입니다. 파이썬은 사랑?')
        return len(self.data)

    def __getitem__(self, index:int) -> int: # 
        print(f'No pain No gain')
        return self.data[index]

이후에 아래의 코드를 입력하면 사진과 같이 출력이 돼요.

x = dataset('파이썬')
print(x)

구동 과정을 알아볼게요.

x = dataset('파이썬') → x = len(self.data) → x = len([1,2,3,4,5]) → x = 5

 

이번에는 __getitem__ 메서드에 대해 알아볼게요.

print(dataset[0])

dataset [0]의 구동과정은

self.data = [1,2,3,4,5] → dataset[0] → __getitem__(index = 0) → return self.data [0] → [1,2,3,4,5][0]

→ So, 1 출력