Python의 비공개 메서드

Rayven Esplanada 2023년1월30일
  1. Python의 개인 액세스 수정 자
  2. Python에서 전용 메서드 선언
Python의 비공개 메서드

이 자습서는 Python에서 비공개 메서드를 선언, 조작 및 활용하는 방법을 보여줍니다.

private는 객체 지향 프로그래밍 언어에서 사용되는 액세스 한정자 유형에 대한 키워드입니다. 액세스 수정자는 함수 또는 변수의 가시성을 어느 정도 제한합니다. 함수 / 변수를 개인으로 선언하면이를 캡슐화하는 클래스에 대한 액세스 만 제한됩니다.

사적인 방법에 대한 실제 비교는 가정용 조명 시스템입니다. 전등 스위치와 전구는 사람이 직접 접근하고 볼 수 있기 때문에 공공 방법과 같습니다. 동시에, 보호 고무 내부의 전선은 조작하지 않으면 일반적으로 보이지 않기 때문에 사적인 방법이지만 대부분의주의를 기울이지 않고 작업을 수행합니다.

Python의 개인 액세스 수정 자

Python에서 private 메서드는 선언 된 클래스 외부 나 다른 기본 클래스에 액세스 할 수없는 메서드입니다.

Python에서 비공개 메서드를 선언하려면 메서드 이름 시작 부분에 이중 밑줄을 삽입합니다.

__init__()메소드

Python에서 주목할만한 private 메서드는 클래스 객체의 클래스 생성자로 사용되는__init__()메서드입니다. 이 메서드는 메서드의 인수에 따라 클래스의 개체가 인스턴스화 될 때 호출됩니다.

예를 들어, 두 개의 필드와__init__()메소드가있는Person클래스를 선언하십시오.

class Person:
    name = ""
    age = 0

    def __init__(self, n, a):
        self.name = n
        self.age = a

이제 클래스 외부의 비공개__init__()메소드에 액세스하려면 인스턴스화 한 후 클래스 자체의 객체에서 액세스해야합니다.

예를 들어, 같은 디렉토리의 다른 파일에서Person클래스의 인스턴스를 만들고 클래스 이름을 사용하여 생성자를 호출합니다.

from personClass import Person

sys.path.append(".")


person = Person("John Doe", 25)

print(person.name, person.age)

출력:

John Doe   25
노트
다른 파일의 클래스를 현재 파일로 가져 오려면 인수로 가져올 클래스의 문자열 경로 디렉토리와 함께sys.path.append()를 사용합니다. 이 경우 두 파일 모두 동일한 폴더에 있으므로 마침표. 충분하다. 그런 다음.py파일 (personClass.py)에서 클래스 (Person)를 가져옵니다.

객체를 다시 인스턴스화하기 위해Person클래스를 변수로 인스턴스화 한 후__init__()메소드를 명시 적으로 호출 할 수 있습니다.

예를 들면 :

person = Person("John Doe", 25)
person.__init__("Jane Doe", 29)

print(person.name, person.age)

출력:

Jane Doe   29

또한__init()__메소드는 클래스 자체에서 호출하여 명시 적으로 호출 할 수 있습니다. 이 방법의 경우 첫 번째 매개 변수self를 인수에 명시 적으로 넣어야합니다.

person = Person("John Doe", 25)
Person.__init__(person, "Jack Sparrow", 46)  # person is the 'self' argument

print(person.name, person.age)

출력:

Jack Sparrow   46

이러한 모든 접근 방식은__init__()메서드의 개인 속성을 유지합니다.

이제이 기본 제공 방법이 분석되었습니다. 실제로 우리 자신의 private 메서드를 클래스로 구현하고 public 메서드와의 액세스를 차별화하는 것으로 넘어가 보겠습니다.

Python에서 전용 메서드 선언

private 메서드를 선언하려면 해당 메서드 앞에 이중 밑줄__를 붙입니다. 그렇지 않으면 기본 공용 메서드로 처리됩니다.

이전 예제에서Person클래스를 확장하고Person클래스의 생성자를 기반으로하는Employee하위 클래스를 생성 해 보겠습니다.

또한 person 클래스 내에 두 개의 새 메서드 인 public 및 private 메서드를 만듭니다.

class Person:
    name = ""
    age = 0

    def __init__(self, name, age):
        self.name = name
        self.age = age

    def walk(self):
        print("Walking")

    def __call(self):
        print("Taking a call")

이제Person을 확장하는 파생 클래스 또는 하위 클래스Employee를 만듭니다.

class Employee(Person):
    occupation = "Unemployed"
    salary = 0

    def __init__(self, name, age, occupation, salary):
        Person.__init__(self, name, age)
        self.occupation = occupation
        self.salary = salary

    def work(self):
        print("Employee is working")
        self.walk()

    def takeCall(self):
        self.__call()
        print("Employee is taking a call")
노트
클래스를 다른 클래스로 확장하려면 부모 클래스의 클래스 이름 인 클래스 선언에 인수를 추가합니다. 이 경우 인수는Person클래스입니다.

이 클래스에서work()takeCall()메소드는 각각 상위 클래스Person에서walk()__call()클래스를 외부 적으로 호출합니다.

다른 메서드는 외부에서 공용 메서드를 호출하고 다른 메서드는 부모 클래스에서 개인 메서드를 호출합니다. 이 동작을 실행할 때 어떻게 작동하는지 봅시다.

예를 들어, 위의 클래스 선언이 주어지면 :

employee_1 = Employee("John Doe", 25, "Software Engineer", 40000)

employee_1.work()
employee_1.takeCall()

출력:

Employee is working
Walking
Traceback (most recent call last):
  File "python/demo.py", line 35, in <module>
    employee_1.takeCall()
  File "python/demo.py", line 29, in takeCall
    self.__call()
AttributeError: 'Employee' object has no attribute '_Employee__call'

work()메소드에 대한 호출이 성공적으로 실행되어work()walk()메소드의 명령문이 인쇄됩니다. 그러나takeCall()에 대한 호출은Employee클래스의 메소드로Person클래스의__call()메소드를 인식하지 않기 때문에AttributeError를 트리거합니다. 클래스를 다른 클래스로 확장하는 것은 확장에 자체 개인 메서드를 포함하지 않습니다.

요약하면, Python의 private 메서드는 두 개의 밑줄__를 접두사로 추가하여 선언됩니다. private 메서드를 선언하면 캡슐화 클래스에 대해 메서드를 독점적으로 예약 할 수 있습니다. private 메서드를 사용하여 다른 클래스를 확장하는 클래스는 해당 메서드를 상속하지 않으며 액세스를 시도하면 오류를 트리거합니다.

Rayven Esplanada avatar Rayven Esplanada avatar

Skilled in Python, Java, Spring Boot, AngularJS, and Agile Methodologies. Strong engineering professional with a passion for development and always seeking opportunities for personal and career growth. A Technical Writer writing about comprehensive how-to articles, environment set-ups, and technical walkthroughs. Specializes in writing Python, Java, Spring, and SQL articles.

LinkedIn

관련 문장 - Python Class