Python의 클래스 메서드, 정적 메서드 및 인스턴스 메서드

클래스 메서드, 정적 메서드 및 인스턴스 메서드

1. 예제 방법

먼저 날짜를 출력하는 클래스 Date를 정의한 다음이 클래스를 기반으로 콘텐츠를 확장합니다.

class Date:
    def __init__(self,year,month,day):
        self.year=year
        self.month=month
        self.day=day
	def __str__(self):
        return "{year}/{month}/{day}".format(year=self.year,month=self.month,say=self.day)
    
if __name__ == "__main__":
    new_day = Date(2018,12,30)
    print(new_day) # 2018/12/30   

클래스의 정의는 상술 한 코드에서와 같이 통상의 환경하에있어서의 일례이다 __init__()__str__()방법의 예이다.

예를 들어 Date, 처음에 클래스 에서 새 인스턴스 메서드 정의합니다 tomorrow. 이 방법은 날짜 수를 하나씩 늘립니다 (단순함을 위해 여기서 날짜를 판단하지 않음).

def tomorrow(self):
    self.day += 1
    
if __name__ == "__main__":
    new_day = Date(2018,12,30)
    new_day.tomorrow() # python会自动转换成tomorrow(new_day)这种形式
    print(new_day) # 2018/12/31  

인스턴스 메서드는 인스턴스에서 작동하는 것이고 이미지 self.变量+赋值符号는 인스턴스 객체의 변수가되며 클래스 변수를 수정해야합니다 类名.变量+赋值符号.

둘째, 정적 방법

먼저 Date클래스에서 전달 된 문자열 매개 변수가 2018-12-31다음과 같다고 가정하여 이러한 시나리오를 소개 합니다. 처음에 정의한 수신 매개 변수는 쉼표로 구분되므로 확실히 작동하지 않습니다.

이 목표를 달성하기 위해 생각하는 가장 쉬운 방법 split은 문자열을 삽입하기 전에 문자열을 처리 하는 함수를 사용하는 것입니다.

date_str = "2018-12-30"
year, month, day = tuple(data_str.split("-"))
# print(year,month,day) # 2018 12 30
new_day = Date(int(year),int(month),int(day))
print(new_day) # 2018/12/30

Date클래스가 문자열을 표준 입력으로 변환하는 방법을 제공하지 않는다고 생각할 수 있습니다. 따라서 먼저 처리 한 다음 입력하는 방법이 있습니다.

이 메서드에는 큰 문제가 있습니다. 즉, Date클래스가 인스턴스화 될 때마다 문자열을 처리하는 코드 (예 :)를 추가해야합니다 year, month, day = tuple(data_str.split("-")).

그러나 사실, 우리는이 로직을 클래스에 넣을 수 있습니다. 즉, 정적 메서드를 정의 할 수 있습니다.

@staticmethod
def parse_from_string(data_str):
    year, month, day = tuple(data_str.split("-"))
    return Date(int(year),int(month),int(day))

python정적 방법은받을 필요가 없습니다 self.

가에 있기 때문에 Date클래스의 네임 스페이스를 사용하는 Date.parse_from_string()호출

#用staticmethon完成初始化
new_day = Date.prase_from_string(date_str)
print(new_day) # 2018/12/30

이 시점에서 코드가 간결 해지고 새로운 로직이 정적 메서드에 추가 될 수 있습니다. 하지만 정적 메소드의 단점은 하드 코딩되어 있다는 점입니다. 클래스 이름이 변경 NewDate되면 정적 메소드의 리턴 Date도 변경 NewDate됩니다. 클래스가 많을 때 번거로울 것입니다.

그래서 파이썬에는 클래스 메소드가 있습니다.

세, 수업 방법

@classmethod
def from_string(cls,data_str):
    year, month, day = tuple(data_str.split("-"))
    return cls(int(year),int(month),int(day))

__init__(self)전달되는 self것은 객체 from_string()cls참조하고 전달되는 것은 클래스 자체 참조합니다. 따라서 이번에 return는 클래스 이름과 관련이 없습니다.

#用classmethon完成初始化
new_day = Date.prase_from_string(date_str)
print(new_day) # 2018/12/30

classmethod완전히 교체 할 수 있다고 생각 staticmethod합니까?

staticmethod물론 다른 용도가 있습니다. 문자열이 합법적인지 여부를 결정하는 또 다른 시나리오를 상상해 봅시다. 이것은 classmethod또한 가능하지만, 더 그것에 대해 생각합니다. 판단의 논리는 문자열 객체를 반환 할 필요가 없으며 필요가 없습니다 classmethon하기 cls에 전달할는.

@staticmethod
def valid(data_str):
    year, month, day = tuple(data_str.split("-"))
    if int(year)>0 and (int(month)>0 and month<=12) and (int(day)>0 and int(day)<=31) #简单的逻辑,实际中判断是否合法不是这样的
    	return True
    elsereturn False
    
print(Date.valid_str("2018-12-32")) # False    

일부

정적 메서드, 데코레이터는 클래스 메서드 앞에 추가해야합니다.

추천

출처blog.csdn.net/weixin_43901214/article/details/106911827