본문 바로가기
Python

파이썬 클래스 변수와 클래스 메서드

by 승환파크 2023. 5. 10.

객체가 변수와 메서드를 가지는 것 처럼 클래스도 변수와 메서드를 가질 수 있다.

 

클래스 변수

표현 방법

class 클래스이름:

    클래스 변수  = 값

 

클래스 변수에 접근하는 방법

클래스이름.변수이름

class Korean:
    country = "한국" # 클래스 변수 country
    
    def __init__(self, name, age, address):
        self.name = name # 인스턴스변수 self.name
        self.age = age # 인스턴스변수 self.age
        self.address = address # 인스턴스변수 self.address

man = Korean("홍길동", 35, "서울")

print(man.name)
# 결과값
# 홍길동

print(Korean.name)
# 결과값
# AttributeError: type object 'Korean' has no attribute 'name'

print(man.country)
# 결과값
# 한국

print(Korean.country)
# 결과값
# 한국

 

클래스 변수와 인스턴스 변수

class Person:
	bag = []
    
    def put_bag(self, stuff):
    	Person.bag.append(stuff)

james = Person()
james.put_bag("책")

maria = Person()
maria.put_bag("열쇠")

print(james.bag)
print(maria.bag)
print(Person.bag)
# 결과값
# ['책', '열쇠']
# ['책', '열쇠']
# ['책', '열쇠']

클래스 변수에는 객체로도 접근할 수 있고 값도 추가 삭제 변경이 모두 가능하다.

 

class Person:
    bag = []
    
    def __init__(self):
        self.bag = []
        
    def put_bag(self, stuff):
        Person.bag.append(stuff)
        
    def put_mybag(self, stuff):
        self.bag.append(stuff)

james = Person()
james.put_mybag("책")
james.put_bag("사전")

maria = Person()
maria.put_mybag("열쇠")
maria.put_bag("자물쇠")

# 같은 이름의 인스턴스 변수와 클래스 변수가 존재할 때는 인스턴스 변수 우선
print(james.bag)
print(maria.bag)
print(Person.bag)
# 결과값
# ['책']
# ['열쇠']
# ['사전', '자물쇠']

위의 코드를 봤을 때는 클래스 변수와 객체 변수 이름이 같은 것을 확인 할 수 있는데 이 때는 객체에서 사용된 변수가 우선되는것을 확인할 수 있다.

 

 

클래스 메서드

인스턴스 또는 클래스로 호출할 수 있고 생성된 인스턴스가 없어도 호출이 가능하다.

클래스 메서드에는 @classmethod 데코레이터를 표시하고 작성해야 한다.

매개변수 cls 를 사용하고 클래스.메서드() 형태로 사용한다.

인스턴스 변수에는 접근할 수 없지만 클래스 변수에는 접근이 가능하다.

주로 인스턴스의 상태를 변화시키지 않는 메서드를 만들 때 사용한다.

 

표현 방법

class 클래스이름:

    @classmethod

    def 클래스함수명(cls, 매개변수):

        pass

 

class Korean:
    country = "한국"
    
    @classmethod
    def trip(cls, country):
        if cls.country == country:
            print("국내 여행")
        else:
            print("해외 여행")

Korean.trip("한국")
# 국내 여행

Korean.trip("미국")
# 해외 여행

 

클래스 변수와 클래스 메서드 모두 사용하기

class Student:
    # 클래스 변수
    count = 0
    students = []
    
    @classmethod
    def print(cls):
        print("------ 학생 목록 ------")
        print("이름\t총점\t평균")
        for student in cls.students:
            print(str(student))
        print("------ ------ ------")
    
    def __init__(self, name, korean, math, english, science):
        self.name = name
        self.korean = korean
        self.math = math
        self.english = english
        self.science = science
        Student.count += 1
        Student.students.append(self)
        
    def get_sum(self):
        return self.korean + self.math + self.english + self.science
    
    def get_average(self):
        return self.get_sum() / 4
    
    def __str__(self):
        return f"{self.name}\t{self.get_sum()}\t{self.get_average()}"

students = [Student("윤인성", 87, 98, 88, 95),
            Student("연하진", 95, 98, 96, 98),
            Student("구지연", 76, 96, 94, 90)]

# 현재 생성된 학생을 모두 출력
Student.print()
# 결과값
# ------ 학생 목록 ------
# 이름	총점	평균
# 윤인성	368	92.0
# 연하진	387	96.75
# 구지연	356	89.0
# ------ ------ ------

'Python' 카테고리의 다른 글

파이썬 프라이빗 변수와 getter, setter  (1) 2023.05.10
파이썬 가비지 컬렉터  (1) 2023.05.10
파이썬 특수한 이름의 메서드  (1) 2023.05.10
파이썬 isinstance 함수  (0) 2023.05.09
파이썬 소멸자  (0) 2023.05.09