programing

정적 방법의 목적은 무엇입니까?언제 사용해야 하는지 어떻게 알 수 있습니까?

testmans 2023. 7. 24. 22:20
반응형

정적 방법의 목적은 무엇입니까?언제 사용해야 하는지 어떻게 알 수 있습니까?

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

import random

class Sample(object):
    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그리고나서

도 무도객체만싶않것입다니의 않을 입니다.class Math
에 다과같방법호출다니합을은음▁like 같은 방법을 사용합니다.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

그것이 우리가 모든 방법을 정적으로 만들지 않는 이유입니다.

Python의 정적 메서드에 대한 대안

의이에대다니합의논해의 논의하기 .@staticmethod는 대안이 ( 여러분이 잘 수 .)@classmethod기타)

  • @staticmethod클래스에 속하지만 인스턴스 또는 클래스 정보에 액세스하거나 수정할 수 없습니다.

세 가지 대안이 있습니다.

  • @classmethod호출자의 클래스에 액세스할 수 있습니다.
  • instance method(일반 메서드)는 호출자의 인스턴스와 해당 클래스에 액세스할 수 있습니다.
  • function클래스와 관련이 없습니다.이 기능은 다음 기능에 가장 가깝습니다.@staticmethod.

코드에서는 다음과 같이 표시됩니다.

# function
# has nothing to do with a class
def make_cat_noise(asker_name):
    print('Hi %s, mieets mieets!' % asker_name)

# Yey, we can make cat noises before we've even defined what a cat is!
make_cat_noise('JOey')  # just a function

class Cat:
    number_of_legs = 4

    # special instance method __init__
    def __init__(self, name):
        self.name = name

    # instancemethod
    # the instance (e.g. Cat('Kitty')) is passed as the first method argument
    def tell_me_about_this_animal(self, asker_name):
        print('Hi %s, This cat has %d legs and is called %s'
              % (asker_name, self.number_of_legs, self.name))

    # classmethod
    # the class (e.g. Cat) is passed as the first method argument
    # by convention we call that argument cls
    @classmethod
    def tell_me_about_cats(cls, asker_name):
        print("Hi %s, cats have %d legs."
              % (asker_name, cls.number_of_legs))
        # cls.name  # AttributeError because only the instance has .name
        # self.name  # NameError because self isn't defined in this namespace

    # staticmethod
    # no information about the class or the instance is passed to the method
    @staticmethod
    def make_noise(asker_name):
        print('Hi %s, meooow!' % asker_name)
        # class and instance are not accessible from here

# one more time for fun!
make_cat_noise('JOey')  # just a function

# We just need the class to call a classmethod or staticmethod:
Cat.make_noise('JOey')  # staticmethod
Cat.tell_me_about_cats('JOey')  # classmethod
# Cat.tell_me_about_this_animal('JOey')  # instancemethod -> TypeError

# With an instance we can use instancemethod, classmethod or staticmethod
mycat = Cat('Kitty')  # mycat is an instance of the class Cat
mycat.make_noise('JOey')  # staticmethod
mycat.tell_me_about_cats('JOey')  # classmethod
mycat.tell_me_about_this_animal('JOey')  # instancemethod

만약에staticmethod어떤 목적으로 작성되느냐에 따라 이들 대안보다 더 낫습니다.

Python 정적 방법의 이점

  • 인스턴스의 스래또인는의속또메대에서드한필액않경요우은지하가스세스,@staticmethod 다낫니다보다 .@classmethod또는instance method그렇게 하면 (로부터) 명확합니다.@staticmethod을 나타냅니다. decorator) 클스및인읽상수나정않지확았지인는다합니되decor거히래태가의스스턴▁decor다확인니합▁that'ator)않decor았'지)▁the., 그나기, 사하용을 function이러한 차이를 더욱 명확하게 합니다(단점 참조).
  • 의 통화 @staticmethod의 그것과 같습니다.@classmethod또는instance method다시 말하면<instance>.<method>(<arguments>)따라서 나중에 또는 파생 클래스에서 필요한 경우 세 가지 중 하나로 쉽게 대체할 수 있습니다.당신은 그것을 단순하게 할 수 없습니다.function.
  • A @staticmethod대신 사용할 수 있습니다.function주체적으로 클래스에 속하는지 확인하고 네임스페이스 충돌을 방지합니다.

Python 정적 방법의 단점

  • 인스턴스 또는 클래스의 특성 또는 메서드에 액세스할 수 없습니다.
  • 의 통화 @staticmethod의 그것과 같습니다.@classmethod또는instance method▁the▁the▁fact다라는 사실을 숨깁니다.@staticmethod에서는 실제로 개체 정보를 읽거나 수정하지 않습니다.이로 인해 코드를 읽기가 어려워집니다.그냥 사용하는 게 어때요?function?
  • A @staticmethod정의된 클래스/서버 외부에서 호출해야 할 경우 재사용하기가 어렵습니다.재사용 가능성이 있는 경우,function그게 더 나은 선택입니다.
  • @staticmethod거의 사용되지 않기 때문에, 하나를 포함하는 코드를 읽는 사람들은 그것을 읽는 데 조금 더 걸릴 수 있습니다.

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

를 때.classmethod개체 인스턴스에서 개체(함수 개체를 감싼 경우), 인스턴스 개체의 클래스는 첫 번째 인수로 전달됩니다.

를 때.staticmethod개체(함수 개체를 감싼 경우), 암시적인 첫 번째 인수는 사용되지 않습니다.

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)

정적 메서드는 메서드가 속한 개체의 인스턴스를 선언할 필요가 없으므로 유용합니다.

python의에 정적 몇 훌륭한문서를 가지고 .
http://docs.python.org/library/functions.html#://docs.python.org/library/functions.html#staticmethod

제가 생각하기에, 사용함으로써 얻을 수 있는 단일 성능 이점은 없습니다.@staticmethods 단순히 클래스 외부와 분리된 함수를 정의하는 것과 비교하면 그렇지 않으면 다음과 같습니다.@staticmethod

제가 그들의 존재를 정당화하는 유일한 말은 편리함입니다.정적 방법은 다른 인기 있는 프로그래밍 언어에서 일반적인데, 파이썬이 아닌 이유는 무엇입니까?하여 함수를 실제로 함수를 클스와매밀게하연접함관동데내인부의클스스턴실스하래래로제만지사우만된을를작여하용자수들고▁a▁if▁with▁that▁slap▁function▁of데내▁in부▁instance인의스▁a▁class턴▁you스▁you▁the▁of클클스▁behaviorual▁of▁thenifyated▁withmod래izing/래▁it▁very▁associ▁class▁data▁that▁is▁internal▁but▁the▁are▁it▁class▁creatingt▁access▁actuallyifies▁concept▁it▁want▁doesn이터를 해당 클래스의 일반적인 메서드로 개념화하는 방식으로 액세스/수정하지 않는 경우 다음을 클릭합니다.@staticmethod그 위에 당신의 코드를 읽는 사람은 즉시 메소드의 본질과 클래스와의 관계에 대해 많은 것을 배울 것입니다.

한는 우리 입니다. ㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜ@staticmethod그런 식으로 나는 내 모듈에 의해 노출된 API를 내 모듈을 사용하는 그 누구도 사용은 물론 볼 필요가 없는 방법으로 혼란스럽게 만들지 않습니다.

정적 메서드는 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

이전에 지적한 대로 네임스페이스 기능이 좋기 때문에:

  1. 개체의 상태를 변경하지 않는 메서드에 대해 명시적으로 설명하고 싶을 때는 정적 메서드를 사용합니다.이것은 우리 팀의 사람들이 이러한 방법으로 개체의 속성을 변경하는 것을 단념시킵니다.

  2. 썩은 많은 방법을 합니다.@staticmethod가 이 할 수 있게 . 없습니다. .이를 통해 이러한 방법을 클래스로 추출할 수 있습니다. 동의하지만 제가 사용하는 것은 거의 없습니다. 몇 번 도움이 되었습니다.

언급URL : https://stackoverflow.com/questions/2438473/what-is-the-purpose-of-static-methods-how-do-i-know-when-to-use-one

반응형