문제
파이썬에서 정적 메소드를 가질 수 있으므로 다음과 같은 클래스를 초기화하지 않고 전화 할 수 있습니다.
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
객체 이름이 아닙니다.
파이썬 정적 방법은 두 가지 방식으로 만들 수 있습니다.
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
@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의 모든 기능은 어떤 식 으로든 복소수에 대해 작용합니다.