python_class()

ssancho·2024년 4월 15일

python

목록 보기
19/26

class 생성 및 활용
예시.
1. 클래스 선언
class MyClass:
name = "MyName" # 멤버 변수
def init(self, name): # 멤버 초기화 메소드(함수) init()

                            #  초기화 메소드에 파라미터수를 원하는대로 정의해서 사용 가능
  self.name = name

def print(self, str): # 멤버 메소드 선언
print(self.name + " " + str)

x = MyClass("Hong Gil Dong.") # 인스턴트 생성 ( MyClass 속성을 가진 x클래스를 실제화 )

                            # 과 동시에 클래스 명칭을 초기화 메소드로 셋팅.(홍길동)

x.print("Hello, Python") # 클래스명과 입력 받은 str 값을 합쳐서 출력하는 멤버 매소드
''' 출력결과 : Hong Gil Dong Hello, Python

클래스 method 선언하여 사용하면,

호출 되는 곳에서 클래스 전체를 호출 받을 수 있음

클래스(class) 메서드
@classmethod 데코레이터를 사용해서 클래스에 메서드를 선언하면
해당 메서드는 클래스(class) 메서드가 되며,
첫번째 매개 변수로 클래스 인스턴스가 아닌 클래스 자체가 넘어오게 됩니다.
이 첫번째 매개 변수의 이름은 보통 관행적으로 cls라고 하며,
클래스 메서드는 이 cls를 통해 클래스 속성(attribute)에 접근하거나,
클래스 메서드를 호출할 수 있습니다.
하지만, 인스턴스 메서드와 달리 인스턴스 속성에 접근하거나
다른 인스턴스 메서드를 호출하는 것은 불가능합니다.

class User:
def init(self, email, password):
self.email = email
self.password = password

** @classmethod
def fromTuple(cls, tup):
return cls(tup[0], tup[1])

** @classmethod
def fromDictionary(cls, dic):
return cls(dic["email"], dic["password"])

파이썬에서는 생성자 오버로딩(overloading)을 지원하기 때문에,
클래스 메서드는 특히 팩토리 메서드를 작성할 때 유용하게 사용됩니다.

예를 들어, 위의 User 클래스는 생성자인 1개의 인스턴스 메서드와 @classmethod 어노테이션이 달린
2개의 클래스 메서드로 이루어져 있습니다.
fromTuple와 fromDictionary 메서드의 첫번째 매개 변수인 cls에는 클래스가 할당되어 있으며,
이 클래스를 호출하면 생성자가 호출되고 인스턴스가 생성되게 됩니다.
fromTuple 메서드는 튜플(tuple) 타입의 인자를 받고,
fromDictionary 메서드는 사전(dictionary) 타입의 인자를 받아서

User 클래스의 객체를 생성해줍니다.

따라서 다음과 같이 팩토리 메서드를 이용해서 다양한 포맷의 데이터로 부터
User 객체를 생성할 수 있습니다.

기본 생성자로 객체 생성

user = User("user@test.com", "1234")
user.email, user.password
('user@test.com', '1234')

클래스 메서드로 튜플로 부터 객체 생성

user = User.fromTuple(("user@test.com", "1234"))
user.email, user.password
('user@test.com', '1234')

클래스 메서드로 사전으로 부터 객체 생성

user = User.fromDictionary({"email": "user@test.com", "password": "1234"})
user.email, user.password
('user@test.com', '1234')

정적(static) 메서드

@staticmethod 데코레이터를 사용해서 클래스에 메서드를 선언하면
해당 메서드는 정적(static) 메서드가 되며,
정적 메서드는 인스턴스 메서드나 클래스 메서드와 달리
첫번째 매개 변수가 할당되지 않습니다.
따라서 정적 메서드 내에서는 인스턴스/클래스 속성에 접근하거나,
인스턴스/클래스 메서드를 호출하는 것이 불가능합니다.

class StringUtils:
@staticmethod
def toCamelcase(text):
words = iter(text.split("_"))
return next(words) + "".join(i.title() for i in words)

@staticmethod
def toSnakecase(text):
letters = ["_" + i.lower() if i.isupper() else i for i in text]
return "".join(letters).lstrip("_")

정적 메서드는 유틸리티 메서드를 구현할 때 많이 사용됩니다.

예를 들어, 위의 StringUtils 클래스는 2개의 정적 메서드로 이루어져 있습니다.
toCamelcase 메서드는 뱀 스타일(snake_case)의 문자열을 낙타 스타일로(CamelCase)로 변환해주며,
toSnakecase는 그 역방향의 변환을 해줍니다.
이 두 개의 메서드는 매개 변수로 넘어온 문자열에만 의존하는 순수한(pure) 함수이기 때문에
굳이 클래스의 일부로 선언할 필요는 없지만,
이렇게 비슷한 류의 여러 유틸리티 메서드를 하나의 클래스의 묶어두고 싶을 때
정적 메서드로 선언할 수 있습니다.

클래스(class) 메서드 vs. 정적(static) 메서드

클래스 메서드와 정적 메서드는 별도 인스턴스 생성없이 클래스를 대상으로 클래스 이름 뒤에
바로 . 오퍼레이터를 붙여서 호출할 수 있다는 점에서 동일합니다.

차이점은 클래스 메서드를 호출할 때, 첫번째 인자로 클래스 자체가 넘어오기 때문에,
클래스 속성에 접근하거나 다른 클래스 함수를 호출할 수 있습니다.
반면에 정적 메서드를 호출할 때는, 첫번째 인자로 아무것도 넘어오지 않기 때문에,
명시적으로 넘긴 다른 인자만 접근할 수 있습니다.

클래스 실습1.

class Warrior() :
def init(self, xhp, xmp, xpoint) :
self.name = '게임캐릭터-전사'
self.hp = xhp
self.mp = xmp
self.attack_point = xpoint
self.xcmd = '공격 !'

def attack(self) :
print(self.xcmd)

x = Warrior(1000,500,30)

print(x.hp, x.mp, x.attack_point)

x.attack() ''' 출력 : 공격 !

profile
Ssancho

0개의 댓글