문제

파이썬에서 정적 메소드를 가질 수 있으므로 다음과 같은 클래스를 초기화하지 않고 전화 할 수 있습니다.

ClassName.StaticMethod ( )
도움이 되었습니까?

해결책

네, 사용 정적 메드 데코레이터

class MyClass(object):
    @staticmethod
    def the_static_method(x):
        print x

MyClass.the_static_method(2) # outputs 2

일부 코드는 정적 메소드를 정의하는 이전 방법을 사용할 수 있습니다. staticmethod 데코레이터가 아닌 기능으로. 고대 버전의 파이썬 (2.2 및 2.3)을 지원 해야하는 경우에만 사용해야합니다.

class MyClass(object):
    def the_static_method(x):
        print x
    the_static_method = staticmethod(the_static_method)

MyClass.the_static_method(2) # outputs 2

이것은 첫 번째 예와 완전히 동일합니다 (사용 @staticmethod), 멋진 데코레이터 구문을 사용하지 않습니다

마지막으로 사용하십시오 staticmethod() 드물게! 파이썬에는 정적 방법이 필요한 상황이 거의 없으며, 별도의 "최상위"기능이 더 명확 해지는 곳에서 여러 번 사용되는 것을 보았습니다.


다음은 문서의 구두입니다.:

정적 메소드는 암시 적 첫 번째 인수를받지 않습니다. 정적 방법을 선언하려면이 관용구를 사용하십시오.

class C:
    @staticmethod
    def f(arg1, arg2, ...): ...

@staticMethod 양식은 함수입니다 데코레이터 - 함수 정의 설명을 참조하십시오 기능 정의 자세한 내용은.

클래스에서 호출 할 수 있습니다 (예 : C.f()) 또는 인스턴스 (예 :) C().f()). 수업을 제외하고 인스턴스는 무시됩니다.

파이썬의 정적 방법은 Java 또는 C ++에서 발견되는 방법과 유사합니다. 보다 진보 된 개념은 참조하십시오 classmethod().

정적 방법에 대한 자세한 내용은 표준 유형 계층 구조에 대한 문서를 참조하십시오. 표준 유형 계층.

버전 2.2의 새로운 새로운.

버전 2.4에서 변경 : 기능 데코레이터 구문이 추가되었습니다.

다른 팁

내 생각에는 스티븐이 실제로 옳습니다. 원래 질문에 대답하려면 클래스 메소드를 설정하기 위해 첫 번째 인수가 호출 인스턴스가 아니라고 가정하고 클래스에서 메소드 만 호출하도록하십시오.

(이 답변은 Python 3.x를 의미합니다. Python 2.x에서는 TypeError 수업 자체에서 방법을 호출하기 위해.)

예를 들어:

class Dog:
    count = 0 # this is a class variable
    dogs = [] # this is a class variable

    def __init__(self, name):
        self.name = name #self.name is an instance variable
        Dog.count += 1
        Dog.dogs.append(name)

    def bark(self, n): # this is an instance method
        print("{} says: {}".format(self.name, "woof! " * n))

    def rollCall(n): #this is implicitly a class method (see comments below)
        print("There are {} dogs.".format(Dog.count))
        if n >= len(Dog.dogs) or n < 0:
            print("They are:")
            for dog in Dog.dogs:
                print("  {}".format(dog))
        else:
            print("The dog indexed at {} is {}.".format(n, Dog.dogs[n]))

fido = Dog("Fido")
fido.bark(3)
Dog.rollCall(-1)
rex = Dog("Rex")
Dog.rollCall(0)

이 코드에서 "RollCall"메소드는 첫 번째 인수가 인스턴스가 아니라고 가정합니다 (클래스 대신 인스턴스에 의해 호출 된 경우). "RollCall"이 인스턴스가 아닌 클래스에서 호출되는 한 코드는 제대로 작동합니다. 인스턴스에서 "RollCall"을 호출하려고하면 예를 들어

rex.rollCall(-1)

그러나 두 가지 인수를 보내기 때문에 예외가 제기 될 것입니다.

또한 rex.rollcall ()은 올바른 수의 인수를 보내지 만, N은 N이 N이 N이 N을 숫자로 기대할 때 개 인스턴스 (즉, Rex)를 나타 내기 때문에 예외를 일으킬 것입니다.

이곳은 장식이 들어오는 곳입니다.

@staticmethod

그런 다음 메소드가 정적이라고 명시 적으로 말하면 인스턴스에서도 호출 할 수도 있습니다. 지금,

rex.rollCall(-1)

작동 할 것이다. 메소드 정의 전에 @staticMethod의 삽입은 인스턴스가 인수로 보내는 것을 막습니다.

@staticMethod 라인이 있거나없는 다음 코드를 시도하여이를 확인할 수 있습니다.

class Dog:
    count = 0 # this is a class variable
    dogs = [] # this is a class variable

    def __init__(self, name):
        self.name = name #self.name is an instance variable
        Dog.count += 1
        Dog.dogs.append(name)

    def bark(self, n): # this is an instance method
        print("{} says: {}".format(self.name, "woof! " * n))

    @staticmethod
    def rollCall(n):
        print("There are {} dogs.".format(Dog.count))
        if n >= len(Dog.dogs) or n < 0:
            print("They are:")
            for dog in Dog.dogs:
                print("  {}".format(dog))
        else:
            print("The dog indexed at {} is {}.".format(n, Dog.dogs[n]))


fido = Dog("Fido")
fido.bark(3)
Dog.rollCall(-1)
rex = Dog("Rex")
Dog.rollCall(0)
rex.rollCall(-1)

예, 확인하십시오 정적 메드 데코레이터 :

>>> class C:
...     @staticmethod
...     def hello():
...             print "Hello World"
...
>>> C.hello()
Hello World

당신은 실제로 사용할 필요가 없습니다 @staticmethod 데코레이터. 메소드를 선언하면 (자체 매개 변수를 기대하지 않음) 클래스에서 호출하십시오. 데코레이터는 인스턴스에서도 호출 할 수 있기를 원할 경우에만 있습니다.

대부분, 당신은 단지 기능을 사용합니다 ...

파이썬의 정적 방법?

파이썬에서 정적 메소드를 가질 수 있으므로 다음과 같은 클래스를 초기화하지 않고 전화 할 수 있습니다.

ClassName.StaticMethod()

예, 정적 메소드는 이렇게 만들 수 있습니다 (조금 더 있지만 피티닉 메소드를 위해 Camelcase 대신 밑줄을 사용하려면) :

class ClassName(object):

    @staticmethod
    def static_method(kwarg1=None):
        '''return a value that is a function of kwarg1'''

위는 Decorator Syntax를 사용합니다. 이 구문은 동일합니다

class ClassName(object):

    def static_method(kwarg1=None):
        '''return a value that is a function of kwarg1'''

    static_method = staticmethod(static_method)

설명대로 사용할 수 있습니다.

ClassName.static_method()

정적 방법의 내장 예는 다음과 같습니다 str.maketrans() Python 3에서 string 파이썬 2.


설명대로 사용할 수있는 또 다른 옵션은 다음과 같습니다. classmethod, 차이점은 클래스 메드가 클래스를 암시적인 첫 번째 인수로 가져오고 서브 클래스가 있으면 하위 클래스를 암시적인 첫 번째 인수로 얻는다는 것입니다.

class ClassName(object):

    @classmethod
    def class_method(cls, kwarg1=None):
        '''return a value that is a function of the class and kwarg1'''

주목하십시오 cls 첫 번째 인수에 필요한 이름은 아니지만 대부분의 경험이 풍부한 Python 코더는 다른 것을 사용하면이를 잘못 고려할 것입니다.

이들은 일반적으로 대체 생성자로 사용됩니다.

new_instance = ClassName.class_method()

내장 된 예는입니다 dict.fromkeys():

new_dict = dict.fromkeys(['key1', 'key2'])

방법의 특수성을 제외하고 정적 메소드 개체 행동, 모듈 수준 코드를 구성 할 때 그들과 함께 파업 할 수있는 특정 종류의 아름다움이 있습니다.

# garden.py
def trim(a):
    pass

def strip(a):
    pass

def bunch(a, b):
    pass

def _foo(foo):
    pass

class powertools(object):
    """
    Provides much regarded gardening power tools.
    """
    @staticmethod
    def answer_to_the_ultimate_question_of_life_the_universe_and_everything():
        return 42

    @staticmethod
    def random():
        return 13

    @staticmethod
    def promise():
        return True

def _bar(baz, quux):
    pass

class _Dice(object):
    pass

class _6d(_Dice):
    pass

class _12d(_Dice):
    pass

class _Smarter:
    pass

class _MagicalPonies:
    pass

class _Samurai:
    pass

class Foo(_6d, _Samurai):
    pass

class Bar(_12d, _Smarter, _MagicalPonies):
    pass

...

# tests.py
import unittest
import garden

class GardenTests(unittest.TestCase):
    pass

class PowertoolsTests(unittest.TestCase):
    pass

class FooTests(unittest.TestCase):
    pass

class BarTests(unittest.TestCase):
    pass

...

# interactive.py
from garden import trim, bunch, Foo

f = trim(Foo())
bunch(f, Foo())

...

# my_garden.py
import garden
from garden import powertools

class _Cowboy(garden._Samurai):
    def hit():
        return powertools.promise() and powertools.random() or 0

class Foo(_Cowboy, garden.Foo):
    pass

이제는 특정 구성 요소를 사용해야하는 컨텍스트가있는 다소 직관적이고 자체 문서화가되어 고유 한 테스트 사례를 명명하고 테스트 모듈이 순수 주의자 테스트하에 실제 모듈에 매핑되는 방법에 대한 간단한 접근 방식을 갖기 위해 이상적으로 진행됩니다. .

프로젝트의 유틸리티 코드를 구성하는 데이 접근 방식을 적용하는 것이 종종 가능하다고 생각합니다. 종종 사람들은 즉시 서두르고 창조합니다 utils 패키지 및 9 개의 모듈로 끝나고 그 중 하나는 120 LOC가 있고 나머지는 최대 24 개의 LOC입니다. 나는 이것으로 시작하여 그것을 패키지로 변환하고 진정으로받을 자격이있는 짐승들에 대해서만 모듈을 만듭니다.

# utils.py
class socket(object):
    @staticmethod
    def check_if_port_available(port):
        pass

    @staticmethod
    def get_free_port(port)
        pass

class image(object):
    @staticmethod
    def to_rgb(image):
        pass

    @staticmethod
    def to_cmyk(image):
        pass

아마도 가장 간단한 옵션은 이러한 기능을 수업 밖에서 배치하는 것입니다.

class Dog(object):
    def __init__(self, name):
        self.name = name

    def bark(self):
        if self.name == "Doggy":
            return barking_sound()
        else:
            return "yip yip"

def barking_sound():
    return "woof woof"

이 방법을 사용하여 내부 객체 상태를 수정하거나 사용하는 기능 (부작용)은 클래스에 보관할 수 있으며 재사용 가능한 유틸리티 기능은 외부로 이동할 수 있습니다.

이 파일이 호출되었다고 가정 해 봅시다 dogs.py. 이것을 사용하려면 전화 할 것입니다 dogs.barking_sound() 대신에 dogs.Dog.barking_sound.

수업의 일부가 되려면 정적 메소드가 실제로 필요하다면 정적 메드 데코레이터.

따라서 정적 방법은 클래스의 객체를 만들지 않고 호출 할 수있는 방법입니다. 예를 들어 :-

    @staticmethod
    def add(a, b):
        return a + b

b = A.add(12,12)
print b

위의 예제에서 add 클래스 이름으로 호출됩니다 A 객체 이름이 아닙니다.

파이썬 정적 방법은 두 가지 방식으로 만들 수 있습니다.

  1. staticMethod () 사용

    class Arithmetic:
        def add(x, y):
            return x + y
    # create add static method
    Arithmetic.add = staticmethod(Arithmetic.add)
    
    print('Result:', Arithmetic.add(15, 10))
    

산출:

결과 : 25

  1. @staticMethod 사용

    class Arithmetic:
    
    # create add static method
    @staticmethod
    def add(x, y):
        return x + y
    
    print('Result:', Arithmetic.add(15, 10))
    

산출:

결과 : 25

나는 때때로이 질문을 만납니다. 내가 좋아하는 유스 케이스와 예는 다음과 같습니다.

jeffs@jeffs-desktop:/home/jeffs  $ python36
Python 3.6.1 (default, Sep  7 2017, 16:36:03) 
[GCC 6.3.0 20170406] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import cmath
>>> print(cmath.sqrt(-4))
2j
>>>
>>> dir(cmath)
['__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'acos', 'acosh', 'asin', 'asinh', 'atan', 'atanh', 'cos', 'cosh', 'e', 'exp', 'inf', 'infj', 'isclose', 'isfinite', 'isinf', 'isnan', 'log', 'log10', 'nan', 'nanj', 'phase', 'pi', 'polar', 'rect', 'sin', 'sinh', 'sqrt', 'tan', 'tanh', 'tau']
>>> 

CMATH 객체에는 상태가 없기 때문에 클래스 CMATH의 객체를 만드는 것은 의미가 없습니다. 그러나 CMATH는 어떤 식 으로든 관련이있는 방법의 모음입니다. 위의 예에서 CMATH의 모든 기능은 어떤 식 으로든 복소수에 대해 작용합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top