언제 @class method를 사용하고 when def method(self)를 사용해야 합니까?
이전에 사용하지 않았던 장고 앱을 통합하면서 클래스 내부의 함수를 정의하는 두 가지 다른 방법을 발견했습니다.저자는 그것들을 독특하고 의도적으로 사용하는 것 같습니다.첫 번째는 제 자신이 많이 사용하는 것입니다.
class Dummy(object):
def some_function(self, *args, **kwargs):
# do something here
# self is the class instance
다른 하나는 제가 절대 사용하지 않는 것입니다. 주로 언제 무엇에 사용해야 하는지 이해하지 못하기 때문입니다.
class Dummy(object):
@classmethod
def some_function(cls, *args, **kwargs):
# do something here
# cls refers to what?
그classmethod
파이썬 문서의 데코레이터는 다음과 같이 말합니다.
클래스 메소드는 인스턴스 메소드가 인스턴스를 수신하는 것과 마찬가지로 클래스를 암시적인 첫 번째 인수로 수신합니다.
저는 서저는래그저는.cls
에대한을 Dummy
자체 (그자체자체((the)class
예가 아님).저는 항상 이렇게 할 수 있었기 때문에 이것이 왜 존재하는지 정확히 이해할 수 없습니다.
type(self).do_something_with_the_class
이것은 단지 명확성을 위해서일까요, 아니면 제가 가장 중요한 부분을 놓쳤을까요? 그것 없이는 할 수 없는 으스스하고 매혹적인 것들입니다.
당신의 추측은 정확합니다. 당신은 방법을 이해합니다. classmethod
일을 보다
그 이유는 이러한 메서드를 인스턴스 OR 또는 클래스 모두에서 호출할 수 있기 때문입니다(두 경우 모두 클래스 개체가 첫 번째 인수로 전달됨).
class Dummy(object):
@classmethod
def some_function(cls,*args,**kwargs):
print cls
#both of these will have exactly the same effect
Dummy.some_function()
Dummy().some_function()
인스턴스에 이러한 기능을 사용하는 경우:인스턴스에서 클래스 메서드를 호출하는 데는 적어도 두 가지 주요 용도가 있습니다.
self.some_function()
는 의 을 호출합니다.some_function
의실제 유형관의 실제 .self
나타나는 보다는 ( 클래스의하지 않을 것이다); 그리고 ▁rather▁in▁the(해▁class),아않▁happens▁and▁than음라니▁call당and▁(▁if필지;요하'▁that▁is▁which▁attention▁to▁the.- 다음과 같은 경우
some_function
일부 프로토콜을 구현하는 데 필요하지만 클래스 개체를 단독으로 호출하는 데 유용합니다.
와의 차이점: 인스턴스 데이터에 액세스하지 않는 메서드를 정의하는 다른 방법은 다음과 같습니다.staticmethod
그러면 암시적인 첫 번째 인수를 전혀 수신하지 않는 메서드가 생성되므로 호출된 인스턴스 또는 클래스에 대한 정보가 전달되지 않습니다.
In [6]: class Foo(object): some_static = staticmethod(lambda x: x+1)
In [7]: Foo.some_static(1)
Out[7]: 2
In [8]: Foo().some_static(1)
Out[8]: 2
In [9]: class Bar(Foo): some_static = staticmethod(lambda x: x*2)
In [10]: Bar.some_static(1)
Out[10]: 2
In [11]: Bar().some_static(1)
Out[11]: 2
기능을 이제가발주이용기것적입다니는용예하됨기상능것을로않존으지을하수신는견은한도기능요이▁(▁a▁thet▁expect▁to▁an(예'which다됨상▁receive▁doesn▁i입▁function▁to▁is▁main▁existing▁it▁adapt니것▁for로제으가것▁found).self
클래스(또는 개체)의 메서드입니다.
의가장일용중하나도인적반▁▁common하의 가장 인 사용법 중 입니다.classmethod
Python에서는 객체를 만드는 가장 효율적인 방법 중 하나인 공장이 있습니다. ㅠㅠclassmethod
like s, 은같staticmethod
s, 클래스 인스턴스를 구성할 필요가 없습니다. (그러나 만약 우리가 사용한다면staticmethod
함수에서 인스턴스 클래스 이름을 하드 코딩해야 합니다.)
이 블로그는 그것을 잘 설명합니다: https://iscinumpy.gitlab.io/post/factory-classmethods-in-python/
decorator @classmethod를 추가하면 Java 또는 C++의 정적 메서드로 해당 메서드를 만들 것이라는 뜻입니다. (static method는 일반적인 용어입니다 ;) Python 또한 has @staticmethod. an d 클래스 메서드와 정적 메서드의 차이는 인수 또는 클래스 이름 자체를 사용하여 클래스 또는 정적 변수에 액세스할 수 있는지 여부입니다.
class TestMethod(object):
cls_var = 1
@classmethod
def class_method(cls):
cls.cls_var += 1
print cls.cls_var
@staticmethod
def static_method():
TestMethod.cls_var += 1
print TestMethod.cls_var
#call each method from class itself.
TestMethod.class_method()
TestMethod.static_method()
#construct instances
testMethodInst1 = TestMethod()
testMethodInst2 = TestMethod()
#call each method from instances
testMethodInst1.class_method()
testMethodInst2.static_method()
모든 클래스는 cls.cls_var를 1씩 증가시키고 인쇄합니다.
동일한 범위에서 동일한 이름을 사용하는 모든 클래스 또는 이 클래스로 구성된 인스턴스는 이러한 메서드를 공유합니다.TestMethod.cls_var가 하나이고 TestMethod.class_method(), TestMethod.static_method()가 하나뿐입니다.
그리고 중요한 질문.왜 이러한 방법이 필요한지에 대해 설명합니다.
클래스 메소드 또는 정적 메소드는 클래스를 공장으로 만들거나 클래스를 한 번만 초기화해야 할 때 유용합니다.파일을 한 번 열고 피드 방법을 사용하여 파일을 한 줄씩 읽습니다.
언급URL : https://stackoverflow.com/questions/10586787/when-should-i-use-classmethod-and-when-def-methodself
'source' 카테고리의 다른 글
항목을 제거할 수 없습니다.디렉터리가 비어 있지 않습니다. (0) | 2023.08.02 |
---|---|
Enter 키를 누르면 클릭 이벤트가 트리거됩니까? (0) | 2023.08.02 |
Angular4 예외:'input'의 알려진 속성이 아니므로 'ngClass'에 바인딩할 수 없습니다. (0) | 2023.08.02 |
django: json 개체로 POST 기반 보기 테스트 (0) | 2023.08.02 |
봄 3의 모든 컨트롤러 모델에 속성 추가 (0) | 2023.08.02 |