ProgramingTip

Python에서 정적 메서드를 사용하면 어떤 이점이 있습니까?

bestdevel 2020. 10. 22. 22:14
반응형

Python에서 정적 메서드를 사용하면 어떤 이점이 있습니까?


코드로 오류에서 바인딩되지 않은 메서드 오류가 발생했습니다.

class Sample(object):
'''This class defines various methods related to the sample'''

    def drawSample(samplesize,List):
        sample=random.sample(List,samplesize)
        return sample

Choices=range(100)
print Sample.drawSample(5,Choices)

여기에서 많은 유용한 게시물을 읽은 후 @staticmethod코드를 작동시키는 방법을 찾았 습니다 . 저는 하나입니다. 누군가 정적 메서드를 정의하려는 이유를 설명해 주시겠습니까? 아니면 모든 메소드가 정적 메소드로 정의되지 않은 이유는 무엇입니까?


정적 메소드는 클래스의 인스턴스 속성에 액세스 할 수없고 (일반 메소드와 액세스) 클래스 자체의 속성에 액세스 할 수 있기 때문에 사용이 제한됩니다. ).

따라서 일상적인 방법에는 유용하지 않습니다.

그러나 할 수없는 필요 변수 (및 모듈에 전역 적으로 일부 속성)없는 클래스 (예 : 한 가지 유형에서 사용할 수있는 클래스)와 함께 일부 유틸리티 함수를 그룹화하는 데 할 할 수 있습니다. )

클래스 외부에 둘 수 있습니다 클래스 내부에 그룹화하면 해당 위치에서만 사용할 수 있습니다.

또한 모듈 이름이 아닌 인스턴스 또는 클래스를 통해 메소드를 참조 할 수도 있습니다. 이렇게하면 독자적인 메서드가 관련된 인스턴스를 이해하는 데 도움이 될 수 있습니다.


자세한 설명 이 가이드참조하십시오 .

TL; DR

1. self논쟁 의 사용을 제거합니다 .

2. Python이 시작된 각 객체에 대해 바운드 메소드 를 인스턴스화 할 필요가 없기 때문에 메모리를 줄입니다 .

>>>RandomClass().regular_method is RandomClass().regular_method
False
>>>RandomClass().static_method is RandomClass().static_method
True
>>>RandomClass.static_method is RandomClass().static_method
True

3. 코드 가독성을 향상시켜 메서드가 객체의 상태에 의존하지 않음을 나타냅니다.

4. 메서드가 모듈 수준 (즉, 외부 클래스)에서 정의 된 경우 하위 클래스가 해당 메서드를 재정의 할 수있는 점에서 메서드 재정의를 허용합니다.


아마도 도움이 될 실제라고 할 수 있습니다.

메서드를 정적 메서드로 만들어 위의 코드를 수정하지 않을 것입니다. 클래스를 버리고 함수를 작성했을 것입니다.

def drawSample(samplesize,List):
    sample=random.sample(List,samplesize)
    return sample

Choices=range(100)
print drawSample(5,Choices)

관련 함수가 많으면 모듈로 그룹화 할 수 있습니다 sample.py. 예를 들어 이름이 같은 파일에 모두 넣습니다 . 그때

import sample

Choices=range(100)
print sample.drawSample(5,Choices)

또는 __init__클래스에 메소드 추가하고 유용한 메소드가있는 인스턴스를 만들었습니다.

class Sample(object):
'''This class defines various methods related to the sample'''

    def __init__(self, thelist):
        self.list = thelist

    def draw_sample(self, samplesize):
        sample=random.sample(self.list,samplesize)
        return sample

choices=Sample(range(100))
print choices.draw_sample(5)

(또한 PEP 8에서 권장하는 스타일과 일치하도록 위의 예에서 대소 문자 규칙을 변경했습니다.)

강요하지 않는다는 것입니다. 클래스의 용도 인 메서드와 연결되어야하는 데이터 또는 상태가있는 경우에만 사용할 수 있습니다. 말할 수있는 기능을 사용할 수 있습니다.


정적 메서드를 정의하려는 이유는 무엇입니까?

우리 가이 백색 가정 class이라는 Math다음

의 object-를 아무도 생성 할을 구석으로 class Math
같은 방법 다음 호출 ceil하고 floor그리고 fabs거기에있다.

그래서 우리는 준비합니다 static.

예를 들어

>> Math.floor(3.14)

보다 훨씬 낫다

>> mymath = Math()
>> mymath.floor(3.14)

그래서 그들은 어떤면에서 유용합니다. 이를 사용하기 위해 클래스의 인스턴스를 만들 필요는 없습니다.

모든 메소드가 정적 메소드로 정의되지 않는 이유는 무엇입니까?

인스턴스 변수에 액세스 할 수 없습니다.

class Foo(object):
    def __init__(self):
        self.bar = 'bar'

    def too(self):
        print self.bar

    @staticmethod
    def foo():
        print self.bar

Foo().too() # works
Foo.foo() # doesn't work

그렇기 때문에 모든 방법을 정적으로 만들지 만들었습니다.


객체 인스턴스에서 함수 객체를 호출하면 '바운드 메서드'가되고 인스턴스 자체가 첫 번째 인수로 전달됩니다.

classmethod객체 인스턴스에서 객체 (함수 객체를 래핑) 를 호출 하면 인스턴스 object-의 클래스가 첫-th 인수로 전달됩니다.

staticmethod객체 (함수 객체를 래핑) 를 호출 할 때 암시 적 첫-th 인수가 사용되지 않습니다.

class Foo(object):

    def bar(*args):
        print args

    @classmethod
    def baaz(*args):
        print args

    @staticmethod
    def quux(*args):
        print args

>>> foo = Foo()

>>> Foo.bar(1,2,3)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unbound method bar() must be called with Foo instance as first argument (got int instance instead)
>>> Foo.baaz(1,2,3)
(<class 'Foo'>, 1, 2, 3)
>>> Foo.quux(1,2,3)
(1, 2, 3)

>>> foo.bar(1,2,3)
(<Foo object at 0x1004a4510>, 1, 2, 3)
>>> foo.baaz(1,2,3)
(<class 'Foo'>, 1, 2, 3)
>>> foo.quux(1,2,3)
(1, 2, 3)

정적 메소드는 메서드가 인스턴스의 인스턴스를 선언 할 필요가 없기 때문에 훌륭합니다.

파이썬 사이트에는 정적 메서드에 대한 몇 가지 훌륭한 문서가 있습니다 :
http://docs.python.org/library/functions.html#staticmethod


네임 스페이스 기능이 좋기 때문에 (이전에 지적했듯이) :

  1. 객체의 상태를 변경하지 않는 메서드를 명시하고 싶을 때는 정적 메서드를 사용합니다. 이것은 우리 팀의 사람들이 이러한 메서드에서 개체의 속성을 변경하기 시작하지 못하게합니다.

  2. 정말 썩은 코드를 리팩토링 할 때 @staticmethod가능한 한 많은 방법을 만드는 것부터 시작 합니다. 이렇게하면 이러한 메서드를 클래스로 추출 할 수 있습니다. 동의하지만이 방법은 거의 사용하지 않지만 몇 번 도움이되었습니다.


정적 메서드는 Python에있을 이유가 거의 없습니다. 인스턴스 메서드 또는 클래스 메서드를 사용합니다.

def method(self, args):
    self.member = something

@classmethod
def method(cls, args):
    cls.member = something

@staticmethod
def method(args):
    MyClass.member = something
    # The above isn't really working
    # if you have a subclass

내 예상으로는 s 를 사용 하는 것보다 s 를 사용 하여 클래스 외부에서 함수를 정의하고 클래스와 분리하는 것과 비교할 때 단일 성능 이점 이 없습니다 .@staticmethod@staticmethod

내가 말하고 싶은 것은 그들의 존재를 정당화하는 유일한 것은 편의입니다. 정적 메서드는 다른 인기있는 프로그래밍 언어에서 일반적입니다. 그렇다면 파이썬은 어떻습니까? 클래스와 매우 밀접하게 관련된 동작을 가진 함수를 만들고 싶지만 클래스 인스턴스의 내부 데이터를 일반적인 것으로 개념화하는 것을 정당화하는 방식으로 실제로 액세스 / 수정하지 않는 경우 그런 다음 해당 클래스의 메서드를 그 @staticmethod위에 두드리면 코드를 읽는 사람은 즉시 메서드의 특성과 클래스와의 관계에 대해 많은 것을 알게됩니다.

내가 가끔 좋아하는 한 가지는 내 클래스가 내부적으로 많이 사용하는 기능을 private에 배치하는 것 @staticmethod입니다. 이렇게하면 내 모듈을 사용하는 사람이 사용은 말할 것도없이 볼 필요가없는 메서드로 모듈에 의해 노출 된 API를 어지럽히 지 않습니다.

참고 URL : https://stackoverflow.com/questions/2438473/what-is-the-advantage-of-using-static-methods-in-python

반응형