>  기사  >  백엔드 개발  >  Python의 일반적인 매직 메서드에 대해 이야기해 보겠습니다.

Python의 일반적인 매직 메서드에 대해 이야기해 보겠습니다.

王林
王林앞으로
2023-05-15 22:34:04861검색

​매직메소드란?

Magic Methods는 Python에 내장된 함수로, 일반적으로 __init__, __del__ 등과 같이 이중 밑줄로 시작하고 끝납니다. 특정 작업을 수행할 때 자동으로 호출되기 때문에 매직 메서드라고 합니다.

Python에서는 dir() 메서드를 사용하여 개체의 모든 메서드와 속성을 볼 수 있습니다. 이중 밑줄로 시작하고 끝나는 것이 개체의 마법 메서드입니다. 문자열 객체를 예로 들어보겠습니다.

>>> dir("hello")
['__add__', '__class__', '__contains__', '__delattr__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__',
'__getitem__', '__getnewargs__', '__getslice__', '__gt__', '__hash__', '__init__', '__le__', '__len__', '__lt__', '__mo
d__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__',
'__sizeof__', '__str__', '__subclasshook__', '_formatter_field_name_split', '_formatter_parser', 'capitalize', 'center',
'count', 'decode', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'index', 'isalnum', 'isalpha', 'isdigit', 'isl
ower', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'partition', 'replace', 'rfind', 'rindex', '
rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate'
, 'upper', 'zfill']

문자열 객체에 __add__ 메서드가 있는 것을 볼 수 있으므로 Python에서 문자열 객체에 "+" 연산을 직접 사용할 수 있습니다. 객체의 __add__ 메소드를 호출합니다. 필요한 경우 원하는 효과를 얻기 위해 자체 클래스에서 __add__ 메서드를 재정의할 수 있습니다.

class A(object):
def __init__(self, str):
self.str = str


• def __add__(self, other):
• print ('overwrite add method')
• return self.str + "---" + other.str


>>>a1 = A("hello")
>>>a2 = A("world")
>>>print (a1 + a2)
>>>overwrite add method
>>>"hello---world"

우리는 __add__ 메소드를 다시 작성했습니다. Python이 "+" 연산을 인식하면 자동으로 다시 작성된 __add__ 메소드를 호출합니다. 보시다시피 매직 메소드는 클래스나 객체의 특정 이벤트가 트리거된 후에 자동으로 실행됩니다. 자신의 프로그램에 따라 특수 기능을 사용하여 클래스를 사용자 정의하려면 이러한 메소드를 다시 작성해야 합니다. 매직 메소드를 사용하면 매우 쉽게 클래스에 특수 함수를 추가할 수 있습니다.

일반적으로 사용되는 매직 메소드

1. 구성 및 초기화

__new__, __init__ 이 두 가지 매직 메소드는 클래스를 초기화하는 데 자주 사용됩니다. 위에서 a1 = A("hello")를 생성했을 때 가장 먼저 호출한 것은 __new__였습니다. 클래스 초기화는 두 단계로 나뉩니다.

  • a 클래스의 새 메서드를 호출하고 클래스의 인스턴스 개체를 반환합니다.
  • b. 클래스의 init 메소드를 호출하여 인스턴스 객체를 초기화합니다.

__new__(cls, *args, **kwargs)에는 들어오는 클래스를 나타내는 하나 이상의 cls 매개 변수가 필요합니다. 마지막 두 매개변수는 __init__에 전달됩니다. __new__에서는 __init__ 메서드를 계속 호출할지 여부를 결정할 수 있습니다. __new__가 현재 클래스 cls의 인스턴스를 반환하는 경우에만 __init__이 호출됩니다. __new__ 메서드의 특성과 결합하여 __new__ 메서드를 재정의하여 Python의 싱글톤 모드를 구현할 수 있습니다.

class Singleton(object):
def __init__(self):
print("__init__")

• def __new__(cls, *args, **kwargs):
• print("__new__")
• if not hasattr(Singleton, "_instance"):
• print("创建新实例")
• Singleton._instance = object.__new__(cls)
• return Singleton._instance

>>> obj1 = Singleton()
>>> __new__
>>> 创建新实例
>>> __init__
>>> obj2 = Singleton()
>>> __new__
>>> __init__
>>> print(obj1, obj2)
>>> (<__main__.Singleton object at 0x0000000003599748>, <__main__.Singleton object at 0x0000000003599748>)

두 객체가 생성되더라도 두 객체의 주소는 동일하다는 것을 알 수 있습니다.

2. 속성 액세스를 제어하는 ​​것과 같은 마법

메서드는 주로 객체의 속성에 액세스하고, 정의하고, 수정할 때 작동합니다. 주요 내용은 다음과 같습니다.

  • __getattr__(self, name): 사용자가 속성을 가져오려고 할 때의 동작을 정의합니다.
  • __getattribute__(self, name): 이 클래스의 속성에 액세스할 때의 동작을 정의합니다(먼저 이 메서드를 호출하여 속성이 존재하는지 확인한 다음, 없으면 getattr을 호출합니다).
  • __setattr__(self, name, value): 속성이 설정될 때의 동작을 정의합니다.

self.a=a와 같은 속성을 초기화하거나 인스턴스가 ins.a와 같은 속성에 액세스할 때 ins.a=1과 같은 인스턴스 속성을 수정할 때 매직 메소드 self.__setattr__(name,values)가 호출됩니다. a.__getattr__(name)

3. 컨테이너 클래스 작업

Python의 내장 List, Tuple, Dict 등과 같은 자체 컨테이너를 정의할 수 있는 몇 가지 메서드가 있습니다. 가변 컨테이너와 불변 컨테이너로 구분됩니다.

변경 불가능한 컨테이너를 사용자 정의하는 경우 변경 가능한 컨테이너를 정의하려면 __len__ 및 __getitem__만 정의할 수 있으며, 변경 불가능한 컨테이너의 모든 매직 메서드 외에도 컨테이너가 반복 가능한 경우 __setitem__ 및 __delitem__도 정의해야 합니다. __iter__도 정의해야 합니다.

  • __len__(self): 컨테이너의 길이를 반환합니다
  • __getitem__(self,key): 컨테이너에 있는 객체를 호출하기 위해 self[key]를 실행해야 할 때 이 메서드를 __setitem__(self,key, value) : self[key] = value를 실행해야 할 때 이 메서드가 호출됩니다
  • __iter__(self):컨테이너가 컨테이너의 x에 대해 실행될 수 있거나 iter(컨테이너)를 사용할 수 있는 경우 이 메서드를 정의해야 합니다.

아래 예를 들어 List의 일반적인 기능을 갖는 컨테이너를 구현하는 동시에 첫 번째 요소, 마지막 요소에 액세스하고 각 요소에 액세스한 횟수를 기록하는 등의 다른 기능을 추가합니다.

class SpecialList(object):
def __init__(self, values=None):
self._index = 0
if values is None:
self.values = []
else:
self.values = values
self.count = {}.fromkeys(range(len(self.values)), 0)

def __len__(self):# 通过len(obj)访问容器长度
return len(self.values)

def __getitem__(self, key):# 通过obj[key]访问容器内的对象
self.count[key] += 1
return self.values[key]

def __setitem__(self, key, value):# 通过obj[key]=value去修改容器内的对象
self.values[key] = value

def __iter__(self):# 通过for 循环来遍历容器
return iter(self.values)

def __next__(self):
# 迭代的具体细节
# 如果__iter__返回时self 则必须实现此方法
if self._index >= len(self.values):
raise StopIteration()
value = self.values[self._index]
self._index += 1
return value

def append(self, value):
self.values.append(value)

def head(self):
# 获取第一个元素
return self.values[0]

def last(self):
# 获取最后一个元素
return self.values[-1]

이 방법의 사용 시나리오는 필요에 맞는 컨테이너 클래스 데이터 구조를 정의해야 할 때 주로 사용됩니다. 예를 들어 트리 구조 및 연결 목록과 같은 데이터 구조를 사용자 정의하려고 할 수 있습니다. 컬렉션에서 이미 사용 가능) 또는 프로젝트에서 사용자 정의해야 하는 일부 컨테이너 유형입니다.

요약

Magic 메서드는 Python 코드에서 코드를 단순화하고 코드의 가독성을 향상시킬 수 있습니다. 일반적인 Python 타사 라이브러리에서 Magic 메서드의 다양한 응용 프로그램을 볼 수 있습니다. 따라서 이 글은 단지 소개에 불과합니다. 실제 사용을 위해서는 우수한 오픈 소스 코드와 자신의 엔지니어링 실습에 대한 지속적인 이해와 적절한 적용이 필요합니다.

위 내용은 Python의 일반적인 매직 메서드에 대해 이야기해 보겠습니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 51cto.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제