본문 바로가기
개발일지/Python

22.03.01 [파이썬 웹개발] class 다시! part1

by 개발에정착하고싶다 2022. 3. 1.
320x100

class는 할 수록 익숙해지는 것 같다.

이해를 한다기 보다는 쇠뇌당해서 그게 맞게끔 생각하게끔 되는 느낌이랄까?

나름의 논리가 있고 그게 합리적이게 보이기도, 비합리적이게 보이기도 한다.

 

# Unit 클래스
class Unit:
    '''
    속성: 이름, 체력, 방어막, 공격력

    '''

    # 생성자 (constructor)
    # 객체를 생성할 때 호출되는 메서드
    def __init__(self,name, hp, shield, demage):
        self.name = name
        self.hp = hp
        self.shield = shield
        self.demage = demage
        print(f"[{self.name}](이)가 생성 되었습니다.")

    # 객체를 출력할 때 호출되는 메서드
    def __str__(self):
        return f"[{self.name}] 체력: {self.hp} 방어막: {self.hp} 공격력: {self.demage}"

# 프로브 객체 생성
probe = Unit("프로브",20,20,5) # [프로브](이)가 생성 되었습니다.

# 질럿 객체 생성
zealot = Unit("질럿",100,60,16)

# 드라군 객체를 생성
dragoon  = Unit("드라군",100,80,20)

print(probe) # [프로브] 체력: 20 방어막: 20 공격력: 5
================================================================
 
 
class Unit:
    '''
   
    인스턴트 속성: 이름, 체력, 방어막, 공격력
    -> 객체마다 다른 값을 가지는 속성

    클래스 속성: 전체 유닛 개수
    -> 모든 객체가 공유하는 속성

    비공개 속성
    -> class 안에서만 사용 가능한 속성
    '''
    count = 0
    def __init__(self,name, hp, shield, demage):
        self.name = name
        self.__hp = hp  # __를 붙여줌으로써 비공개로 만든다.
        self.shield = shield
        self.demage = demage
        Unit.count +=1 # class 안에 있지만, 이와같은 count의 위치처럼 같은 def안에 있는게 아니라면 이런식으로 써줘야한다.
        print(f"[{self.name}](이)가 생성 되었습니다.")

    def __str__(self):
        return f"[{self.name}] 체력 : {self.__hp} 방어막 : {self.shield} 공격력 : {self.demage}"

probe = Unit("프로브",20,20,5)
zealot = Unit("질럿",100,60,16)
dragoon = Unit("드라군",100,80,20)


# 인스턴스 속성 수정
probe.demage +=1 # class 밖에서 접근할 때는 class 정의 함수.수정 원하는 인스턴드 속성
                #객체명.인스턴트 속성명
print(probe)


# 전체 유닛 개수
print(Unit.count)

# 비공개 속성 접근
probe.__hp = 9999
print(probe)

# 비공개 속성으로 접근해주면 변경은 되었으나, 가시적으로 드러나진 않는다.
# 이를 확인 하기 위해서는 "네임 맹글링"이라는게 필요하다. name mangling
probe._Unit__hp = 9999
print(probe)


이번파트에서 다른건 그래도 어느정도 이해가 되었다.
그러나 비공개 속성 접근과 네임 맹글링은 오.. 난해하다.
원리에 대해서 알려주지 않았을 뿐더러 잘 모르겠다.

 

===========================================================

 

class Math:
   
    # 정적 메서드(static method)
    # 인스턴스를 만들 필요가 없는 메서드

    @staticmethod
    def add(x,y):
        return x+y

    @staticmethod
    def sub(x,y):
        return x - y


Math.add(3,4)
print(Math.add(3,4))
print(Math.sub(3,4))
300x250