source

언제 @class method를 사용하고 when def method(self)를 사용해야 합니까?

factcode 2023. 8. 2. 09:27
반응형

언제 @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()

인스턴스에 이러한 기능을 사용하는 경우:인스턴스에서 클래스 메서드를 호출하는 데는 적어도 두 가지 주요 용도가 있습니다.

  1. self.some_function()는 의 을 호출합니다.some_function의실제 유형관의 실제 .self나타나는 보다는 ( 클래스의하지 않을 것이다); 그리고 ▁rather▁in▁the(해▁class),아않▁happens▁and▁than음라니▁call당and▁(▁if필지;요하'▁that▁is▁which▁attention▁to▁the.
  2. 다음과 같은 경우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하의 가장 인 사용법 중 입니다.classmethodPython에서는 객체를 만드는 가장 효율적인 방법 중 하나인 공장이 있습니다. ㅠㅠclassmethod like s, 은같staticmethods, 클래스 인스턴스를 구성할 필요가 없습니다. (그러나 만약 우리가 사용한다면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

반응형