일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 소프트웨어공학
- 보안
- I'm Sorry
- 코딩
- 딥러닝
- 머신러닝
- 프로그래밍언어
- 데이터베이스
- 데이터과학
- Yes
- 프로그래밍
- 알고리즘
- 인공지능
- 자바스크립트
- 클라우드컴퓨팅
- 파이썬
- 사이버보안
- 빅데이터
- 데이터구조
- 컴퓨터과학
- 웹개발
- 2
- 컴퓨터공학
- 컴퓨터비전
- 데이터분석
- 네트워크보안
- 버전관리
- 자료구조
- 소프트웨어
- 네트워크
- Today
- Total
스택큐힙리스트
@staticmethod와 @classmethod의 차이점 본문
decorated과 @staticmethod로 꾸며진 방법과 @classmethod로 꾸며진 방법의 차이점은 무엇입니까?
답변 1
어쩌면 예시 코드가 도움이 될지도 모릅니다: foo , class_foo 및 static_foo 의 호출 서명 차이점에 유의하십시오.
class A(object):
def foo(self, x):
print(fexecuting foo({self}, {x}))
@classmethod
def class_foo(cls, x):
print(fexecuting class_foo({cls}, {x}))
@staticmethod
def static_foo(x):
print(fexecuting static_foo({x}))
a = A()
아래는 객체 인스턴스가 메서드를 호출하는 일반적인 방법입니다. 객체 인스턴스 a는 암시적으로 첫 번째 인수로 전달됩니다.
a.foo(1)
# executing foo(<__main__.A object at 0xb7dbef0c>, 1)
classmethods를 사용하면 객체 인스턴스의 클래스가 암시적으로 첫 번째 인수로 전달되며 self 대신 사용됩니다.
a.class_foo(1)
# executing class_foo(
클래스를 사용하여 class_foo 를 호출할 수도 있습니다. 사실, 무언가를 클래스 메소드로 정의한다면 클래스 인스턴스가 아닌 클래스에서 호출할 것이기 때문입니다. A.foo(1) 은 TypeError를 발생시켰겠지만, A.class_foo(1) 는 아주 잘 작동합니다.
A.class_foo(1)
# executing class_foo(
클래스 메서드의 한 가지 사용 용도는 inheritable alternative constructors 를 생성하는 것입니다.
staticmethod 메소드를 사용하면, 객체 인스턴스 self! 와 클래스 cls! 가 첫번째 인자로 암시적으로 전달되지 않습니다. 이들은 일반 함수처럼 작동하지만 인스턴스 또는 클래스에서 호출할 수 있습니다.
a.static_foo(1)
# executing static_foo(1)
A.static_foo('hi')
# executing static_foo(hi)
정적 메서드는 클래스와 논리적으로 연결된 함수를 클래스에 그룹화하는 데 사용됩니다.
foo e는 단지 함수일 뿐이지만, a.foo를 호출하면 함수뿐만 아니라 함수의 첫 번째 인수로 바인딩된 객체 인스턴스가 포함된 부분 적용된 버전을 얻습니다. foo e는 2개의 인수를 예상하지만, a.foo는 1개의 인수만을 예상합니다.
a는 foo에 결합되어 있습니다. 결합이라는 용어가 의미하는 것입니다.
print(a.foo)
#
#^!^$$&와 함께, a는 class_foo에 묶이지 않으며, 대신 @# is bo 클래스가 class_foo에 묶입니다.
print(a.class_foo)
#
여기서, staticmethod로 인해, 이것이 메소드임에도 불구하고 a.static_foo는 인자를 바인드하지 않은 일반적인 함수를 반환합니다. _foo expects 는 인자를 1개 예상하며, a.static_foo 도 인자를 1개 예상합니다.
print(a.static_foo)
#
물론, 같은 일이 static_foo와 함께 A 클래스로 호출될 때 발생합니다.
print(A.static_foo)
#
답변 2
@staticmethod와 @classmethod의 차이점은 무엇인가?Python에서 @staticmethod와 @classmethod는 두 개의 데코레이터로 구분된다. 둘 다 클래스에서 메소드를 호출할 수 있게 해준다는 공통점이 있지만, 그들은 목적이 다르다. 이 글에서는 두 데코레이터 간의 차이를 이해하기 위한 세부 사항을 살펴보려고 한다.
@staticmethod는 클래스 내에서 정적 메소드를 정의하기 위한 데코레이터이다. 이 메소드는 객체와 관련이 없는 기능을 수행하며, 클래스의 모든 인스턴스에서 공유될 수 있다. 이것은 클래스를 인스턴스화하지 않아도 호출될 수 있으며, 인수로 받은 정보에만 근거하여 동작하는 데 사용된다.
@classmethod는 클래스의 인스턴스를 생성하지 않고도 클래스 자체를 수정하고 호출할 수 있는 메소드를 정의하는 데 사용된다. 일반적으로 첫번째 파라미터는 'cls'를 사용하며, 클래스의 이름을 받는다. 이 메소드는 클래스 자체에 대한 작업을 수행할 수 있다. 이것은 클래스 또는 어떤 하위 클래스에서도 호출할 수 있다.
따라서, @staticmethod와 @classmethod의 차이점은 정적 메소드와 클래스 메소드 간의 차이에 따라 정의된다. 정적 메소드는 객체에 관계없이 클래스 메소드를 수행하며, 클래스 메소드는 클래스에 관한 작업을 수행한다. 이런 차이점은 코드의 상황과 목적에 따라 용도가 구분된다.
그리고 이러한 데코레이터들은 코드의 가독성과 유지 보수를 보장한다는 장점이 있다. 또한 코드를 더욱 객체지향적으로 만들어주어 객체 지향 개발에 매우 유용하다.
마지막으로, Python 소프트웨어 개발에서 @staticmethod와 @classmethod는 매우 유용한 데코레이터이며, 이해하는 데 많은 도움을 줄 수 있다. 이러한 메소드를 올바르게 이해하고 사용할 줄 아는 프로그래머가 된다면, 더 나은 코드를 작성할 수 있는 기초를 마련할 수 있다.