Home Python 12 - Class 1
Post
Cancel

Python 12 - Class 1

Class

  • 그 클래스.
    붕어빵틀 이면서
    자동차 설계도 등.
  • 아무튼 속성이랑 메서드를
    포함하는 전체.

python class

basic includes

  • 기본적으로 만들면
    포함하고있는 것들이 있는데

    1
    2
    3
    4
    
    class temp:
        a = None
      
    print(dir(temp))
    
    1
    2
    3
    4
    5
    6
    
    ['__class__', '__delattr__', '__dict__', '__dir__', 
    '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', 
    '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', 
    '__lt__', '__module__', '__ne__', '__new__', '__reduce__', 
    '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', 
    '__str__', '__subclasshook__', '__weakref__', 'a']
    

    a는 직접 쓴거니까 제외하고 저런게 있음.

  • 위는 오다가다 볼 내용들이니 넘기고
    기본적인 명세와 사용은 이렇다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
    class Unit:
        name = "" 
        hp = 0
        def __init__(self, name, hp):
            self.name = name
            self.hp = hp
        def print_info(self):
            print("Name:", self.name)
            print("HP:", self.hp)
      
    unit1 = Unit("marine", "120")
    unit1.print_info()
    

new instance

  • 인스턴스 생성은
    var = ClassName(args)
  • new 키워드가 안붙음.

self

  • 자신 class를 말하고
    instance화 했을 떄
    자기 자신의 주소를 갖는다고?
    하면 this랑 비슷한듯.
  • class안 method의
    첫번째 parameter로 항상 들어옴.
    써주기만하고 실제로 전달받지는 않음.
  • 다만, method에서 field로
    접근이 필요없다면
    self는 parameter에서 생략 가능.
    위 같은 경우def print_info(self):
    에서 self를 뻈을 때 name, hp
    접근이 안됨

  • 아무튼 그렇다는데 자주보이니
    아직 확실치는 않아도
    익숙해지것지.

Constructor

  • 생성자. 위에도 씀.
  • __init__ 로 예약됨.
  • 없어도 상관없긴함. 원래 알던 비슷한 이유일듯.
  • 좀 특이한점이 있는데 overload가 안됨.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    
    class asdf:
        a = ''
        b = ''
        c = ''
        def __init__(self):
            self.a = 1
            self.b = 2
            self.c = 3
        def __init__(self, a, b, c):
            self.a = a
            self.b = b
            self.c = c
        def __init__(self, a, b, c, d):
            self.a = a
            self.b = b
            self.c = c
            self.d = d
          
    a2 = asdf()
    a1 = asdf('a','b','c')
      
    print()
    

    이 경우 문제가 되는데

    1
    2
    
    TypeError: __init__() missing 4 required positional arguments: 
    'a', 'b', 'c', and 'd'
    

    라고 한다.

    __init__는 마지막에 쓴거만 쓰나봄.

Member variable

  • 위에 쓴 name, hp를 말함.
    class에 속한 변수들.

무친기능 1

  • 위에는 name, hp를
    명시했는데 없어도 됨

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    class Unit:
        def __init__(self, name, hp):
            self.name = name
            self.hp = hp
        def print_info(self):
            print("Name:", self.name)
            print("HP:", self.hp)
      
    unit1 = Unit("marine", "120")
    unit1.print_info()
    

    똑같은 동작을 하는데

    1
    2
    3
    4
    5
    6
    7
    8
    
    print(dir(unit1))
      
    ['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', 
    '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', 
    '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', 
    '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', 
    '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 
    '__weakref__', 'hp', 'name', 'print_info']
    

    dir을 보면 쓰지 않았던 hp, name을 갖고 있다.
    init에 써줘서 알아서 해주나봄.
    근데 init에서 해주는것보다 그 전에 명시해주는게
    보기 좋지 않을까? 아무튼.

무친기능 2

  • 위 예제에 이걸 더한다.

    1
    2
    3
    4
    5
    6
    7
    8
    
    unit2 = Unit("firebat", "120")
    unit2.print_info()
      
    unit1.range = 30
      
    print ("unit1 Range:", unit1.range)
    print ("unit2 Range:", unit2.range)
      
    

    unti1에 range라는 속성이 하나 더 생김.
    unit2에는 안생김. 세상에

Member variable share

  • 같은 class끼리
    멤버공유가 가능한데
    Unit class를 예로들어

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    
      class Unit:
        def __init__(self, name, hp):
            self.name = name
            Unit.hp = hp
        def print_info(self):
            print("Name:", self.name)
            print("HP:", self.hp)
      
    u1 = Unit("전사", 100)
    u1.print_info()
    u2 = Unit("마법사", 200)
    u1.print_info()
    u2.print_info()
    
    1
    2
    3
    4
    5
    6
    
    Name: 전사
    HP: 100
    Name: 전사
    HP: 200
    Name: 마법사
    HP: 200
    
    • 전사hp의 경우 마법사에서 바꾼 hp를 따라감.
    • class.member로 써서 나타냄.
  • 일반적으로 쓰는걸 instance variable,
    공유가능한걸 class variable 라고 함.
  • class variable에 접근시
    classname.variabe를 권장하는데
    self를 해도 상관없는것같긴하다.

Method

  • 기능담당.
  • 위에 쓰는것처럼.
  • 이 전에 따로 썼으니 패스
This post is licensed under CC BY 4.0 by the author.

Python 11 - Collection 2

Python 13 - Class 2

Comments powered by Disqus.