PYTHON

Class

성지우 2022. 8. 16. 16:46

Function

하나의 특정 작업을 수행하기 위해 독립적으로 설계된 프로그램 코드

Class

함수뿐만 아니라 관련된 변수까지도 한꺼번에 묶어서 관리하고 재사용할 수 있게 해주는 것

 

Object

class = 붕어빵 틀

object = 붕어빵

하나의 클래스로부터 무수히 많은 객체 생성가능

 

Attribute

class에 포함되는 변수

 

Method

class에 포함되는 함수

class내 기재되어 있는 함수

Instants

class에 정의된 데이터나 함수를 사용하기 위해 생성

class를 실체화한 것

class를 기반으로 생성된 객체를 가리킴

인스턴스명 = 클래스명()

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Dog: # 클래스 선언
 
    name = "삼식이"
 
    age = 3
 
    breed = "골든 리트리버"  
 
 
 
    def bark(self):
 
        print(self.name + "가 멍멍하고 짖는다.")    
 
 
 
my_dog = Dog()      # 인스턴스 생성  
 
 
 
print(my_dog.breed) # 인스턴스의 속성 접근
 
my_dog.bark()       # 인스턴스의 메소드 호출
cs

Dog class는 name, age, breed라는 속성들과 bark()라는 메소드로 구성

my_dog는 객체이다

my_dog는 Dog 클래스의 인스턴스다

class선언

class 키워드 사용해 선언

def 키워드 사용해 메소드 선언 

1
2
3
4
5
6
7
8
9
class SomeClass:
    def __init__(self,something):
        self.something = something
 
    def some_function(self):
        print(self.something)
        
= SomeClass("some_value")
a.some_function()
cs

 

Self

클래스의 인스턴스를 나타내는 변수

self는 class내 method들의 첫번째 인자로 전달

1
2
3
4
5
6
7
8
class Person:
    def sayHello():
      print('Hi')
 
man = Person()
man.sayHello()
 
#TypeError: sayHello() takes 0 positional arguments but 1 was given
cs

→ self를 전달하지 않은 메소드를 만들어도 상관없으나 에러가 뜸

 

1
2
3
4
5
6
7
8
9
class Person:
    def sayHello(self):
      print('Hi')
 
man = Person()
man.sayHello()
 
# result 
#Hi
cs

→ self를 sayHello메소드에 넣자 잘 수행됨

=> 클래스의 메소드들은 self를 첫번째 인자로 받도록 해줘야 함

=>> Python이 자동으로 self를 전달하기 때문

 

self의 위치를 통해 역할 알아보기

 

1
2
3
4
5
6
7
8
9
class Person:
    def sayHello(self):
      # id() = 객체의 메모리주소를 알아내는 함수
      print(id(self))
      print('Hi')
 
man = Person()
man.sayHello()
print(id(man))
cs
140045137514192
Hi
140045137514192  
# self의 주소나 man의 주소가 같음

즉, man이나 self나 사실 같은 것

__init__

initialize method (초기화 메소드)
초기화를 위한 함수
인스턴스화를 실시할때 반드시 처음에 호출되는 특수한 함수
오브젝트 생성(인스턴스 생성)과 관련해 데이터의 초기를 실시하는 함수

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Dog:
 
    def setInfo(self, name):
 
        self.name = name
 
    def bark(self):
 
        print(self.name + "가 멍멍하고 짖는다.")
 
 
my_dog = Dog()
 
my_dog.bark()
 
# 결과 : AttributeError: 'Dog' object has no attribute 'name'
cs
  1. Dog클래스의 my_dog인스턴스 생성
  2. set_info() 메소드 호출
  3. name이라는 변수를 먼저 선언
  4. bark() 메소드 호출

→ name이란 변수를 초기화해야함, __init__메소드 사용

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Dog: # 클래스 선언
 
    def __init__(self, name):
 
        self.name = name  
 
 
 
    def bark(self):
 
        print(self.name + "가 멍멍하고 짖는다.")    
 
 
my_dog = Dog("삼식이"# 인스턴스 생성
 
my_dog.bark() # 인스턴스의 메소드 호출
 
 
cs

 

__init__()은 반드시 첫번째 인수를 self로 지정

1
2
3
class SomeClass:
    def __init__(self,something):#constructor
        self.something = something
cs

 

여러개의 정보를 변수로 하는 class구문

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class MyStatus:
    def __init__(self,age,name,height,weight):
        self.age = age
        self.name = name
        self.height = height
        self.weight = weight
 
    def print_name(self):
        print(self.name)
 
    def print_age(self):
        print(self.age)
 
    def print_height(self):
        print(self.height)
 
    def print_weight(self):
        print(self.weight)
 
= MyStatus(34,"yamada",170,78)
cs

 

__call__

함수를 호출하는 것처럼 클래스의 객체도 호출하게 만들어주는 메소드

__init__은 인스턴스 초기화, __call__은 인스턴스가 호출되었을 때 실행

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Calc: 
  def __init__(self,n1,n2):
    self.n1=n1
    self.n2=n2
    return print(self.n1,self.n2)
 
  def __call__(self,n1,n2):
    self.n1=n1
    self.n2=n2
    return print(self.n1+self.n2)
 
= Calc(1,2)
 
s(7,8)
cs
result
1 2
15

 

→ 이처럼 __init__으로 class생성, __call__로 정의된 것을 함수처럼 불러오게 하는 역할

 

 


참고 및 출처 : http://www.tcpschool.com/python2018/python_class_object , https://engineer-mole.tistory.com/190 , https://jsp-dev.tistory.com/entry/Python-self-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0 , https://wjunsea.tistory.com/61