내 잡다한 노트

[Python] 클래스, 메소드와 관련된 문법 본문

Language/Python

[Python] 클래스, 메소드와 관련된 문법

peanutwalnut 2023. 5. 11. 22:34

클래스의 attribute

__init__ 생성자 안에서 self.attribute = value 의 형식을 작성해 독립적인 객체들만의 고유한 변수를 만들 수 있다.

밑의 클래스 변수와 구별해야한다.

다른 방법으로는 인스턴스를 만든 뒤 속성을 추가하는 방식이 있다. 그러면 해당 인스턴스에만 추가한 속성이 

생긴다.

 

상속

상속은 말 그대로 어떤 클래스에 다른 클래스의 기능을 물려받을 수 있도록 할 수 있는 기능이다.

용도))) 기존 클래스를 변경하지 않고 기능을 추가하거나 기존 기능을 변경하려고 할 때 사용.

문법)) 

class child(parent):

    pass

상속 관계를 영어로 is-a 관계라고 부른다.

다중상속도 가능해서 클래스 이름 옆 괄호안에 상속할 부모클래스를 여러개 넣을 수 있다.

메소드 탐색 순서는 상속하는 클래스 목록 중 왼쪽에서 오른쪽 순서로 메소드를 찾는다.

 

추상클래스

용도))) 메소드의 목록만 가진 클래스이며 상속받는 클래스에서 메소드 구현을 강제하기 위해 사용한다.

만들려면 abc 모듈을 import 해야한다. abstract base class의 약자라고 한다.

문법)))

import abc

class 추상클래스이름(metaclass=abc.ABCMeta):

    @abc.abstractmethod

    def 메소드이름(self):

 

 

포함 관계

용도 예시))) 사람 목록을 관리하는 클래스를 만들 때

class Person:
    pass

class PersonList:
    def __int__(self):
        self.person_list = []
    
    def append_person(self, person):
        self.person_list.append(person)

PersonList 안에 Person 인스턴스들이 들어가서 PersonList에서 한꺼번에 관리할 수 있게 된다.

이런 관계를 has-a 관계라고 부른다.

 

메서드 오버라이딩

부모 클래스에 있는 메서드를 동일 이름으로 다시 만드는 것을 말한다.

 

클래스 변수(속성)

생성자로 만든 변수는 객체 변수이고 객체 변수는 다른 객체들에 영향을 받지 않고 독립적인 값을 유지한다.

클래스 변수는 클래스 내에 선언한 변수를 말하며 사용은 클래스이름.클래스변수 로 한다.

클래스변수는 객체가 여러개 있어도 클래스 변수의 값을 서로 공유한다.

class Sun:
    lightness = 100

n = Sun()
print(n.lightness)

Sun.lightness = 5
print(n.lightness)

처음 출력은 100, 두번째 출력은 5가 된다.

 

비공개 클래스 속성

__속성과 같이 언더스코어 2개로 시작하면 비공개 속성이 된다. 클래스 안에서만 접근할 수 있고, 바깥에서는 접근할

수 없다.

 

정적 메서드

정적 메서드는 메서드 위에 @staticmethod를 붙인다. 이때 정적 메서드는 매개변수에 self를 지정하지 않는다.

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

class Jaesun:
    def __init__(self):
        self.customer = 10

    @staticmethod
    def print(a, b):
        print(a, b)

Jaesun.print(30, 40)

클래스에서 바로 메소드를 호출하면 된다.

 

클래스 메소드

메소드 위에 @classmethod를 붙여야 하고 첫 번째 매개변수에 cls를 지정해야 한다.

문법)))

class 클래스이름:

    @classmethod

    def 메소드(cls, 매개변수):

cls는 클래스 자기 자신을 가리킨다.

class Jaesun:
    count = 0
    def __init__(self):
        self.customer = 10
        Jaesun.count += 1

    @classmethod
    def print_count(cls):
        print(f"{cls.count} 개가 인스턴스로 있습니다.")
        instan = cls()
        print(instan.customer)

one = Jaesun()
Jaesun.print_count()

클래스메소드라 클래스에서 바로 선언하도록 했고, 클래스 메소드에 매개변수 cls가 클래스를 가리켜서

instan 처럼 인스턴스를 만들고 그 인스턴스로 attribute를 사용할 수도 있다.

정적 메소드처럼 인스턴스 없이 호출할 수 있다는 점은 같으나, 클래스 메소드는 메소드 안에서 클래스 속성,

클래스 메소드에 접근해야 할 때 사용한다. 

 

super

super()를 통해 부모 클래스로 접근할 수 있다. 

부모 클래스의 생성자를 실행시키고 싶다면 super().__init__()을 해주면 된다.

만약 자식 클래스에 __init__ 메소드가 없다면 부모 클래스의 __init이 자동으로 호출된다.

과정을 살펴보면 자식 클래스를 먼저 찾아보고 없다면 부모 클래스로 올라가는 과정이다.

super()의 인자로는 두 개가 전달되며, 자식클래스의 이름과, 인스턴스가 필요하다.

클래스 선언 내부에서 super를 호출하면, 인자 전달을 따로 하지 않아도 자동으로 부모 클래스를 호출해준다.

'Language > Python' 카테고리의 다른 글

가상환경  (0) 2024.11.23
데코레이터와 클로저 간단하게 구현  (0) 2023.09.04
numpy 배열 연산, 접근법  (0) 2023.04.04
(numpy)배열 생성, Shape  (0) 2023.04.04
[Python] 알아두면 좋을 문법 정리  (0) 2023.03.12