초보자용 @classmethod와 @staticmethod의 의미
요?@classmethod
★★★★★★★★★★★★★★★★★」@staticmethod
Python에서는 평균이며, 어떻게 다른가요?언제 사용해야 하며, 왜 사용해야 하며, 어떻게 사용해야 합니까?
가 as as as as as as as as as as as 。@classmethod
가 있어요지만만 그슨? 슨? ??? ''을 '클래스 방식'을 죠?@classmethod
★★★★★★★★★★★★★★★★★」@staticmethod
임의의 「」를 참조해 주세요.@
정??
classmethod
★★★★★★★★★★★★★★★★★」staticmethod
에는 꽤, 두classmethod
를 첫 번째 반해 에서는 클래스 오브젝트를 할 필요가 있습니다.staticmethod
에는 파라미터를 전혀 포함할 수 없습니다.
예
class Date(object):
def __init__(self, day=0, month=0, year=0):
self.day = day
self.month = month
self.year = year
@classmethod
def from_string(cls, date_as_string):
day, month, year = map(int, date_as_string.split('-'))
date1 = cls(day, month, year)
return date1
@staticmethod
def is_date_valid(date_as_string):
day, month, year = map(int, date_as_string.split('-'))
return day <= 31 and month <= 12 and year <= 3999
date2 = Date.from_string('11-09-2012')
is_date = Date.is_date_valid('11-09-2012')
설명.
날짜 정보를 다루는 클래스의 예를 가정해 보겠습니다(이것은 우리의 보일러 플레이트입니다).
class Date(object):
def __init__(self, day=0, month=0, year=0):
self.day = day
self.month = month
self.year = year
이 클래스는 특정 날짜에 대한 정보를 저장하는 데 사용할 수 있습니다(타임존 정보 없이 모든 날짜가 UTC로 표시된다고 가정합니다).
, 여기 있습니다.__init__
하고 첫 인수(Python " " " " )를 사용합니다.self
새로 생성된 인스턴스에 대한 참조를 보관합니다.
클래스 메서드
.classmethod
s.
많은 것을 Date
외부 소스로부터의 날짜 정보가 'dd-mm-yyy' 형식의 문자열로 인코딩된 클래스 인스턴스.프로젝트의 소스 코드의 다른 장소에서 이 작업을 수행해야 한다고 가정해 보겠습니다.
여기서 해야 할 일은 다음과 같습니다.
- day, month, year를 3개의 정수 변수 또는 해당 변수로 구성된3개의 항목 태플로 수신하는 문자열을 해석합니다.
- (instantize)
Date
이치
이것은 다음과 같습니다.
day, month, year = map(int, string_date.split('-'))
date1 = Date(day, month, year)
이를 위해 C++는 오버로드 기능을 구현할 수 있지만 Python은 이 오버로드 기능이 없습니다.ㅇㅇㅇㅇ를 사용하면 .classmethod
다른 컨스트럭터를 만듭니다.
@classmethod
def from_string(cls, date_as_string):
day, month, year = map(int, date_as_string.split('-'))
date1 = cls(day, month, year)
return date1
date2 = Date.from_string('11-09-2012')
위의 구현에 대해 좀 더 자세히 살펴보고 여기에 어떤 이점이 있는지 살펴보겠습니다.
- 날짜 문자열 구문 분석을 한 곳에서 구현하여 현재 재사용할 수 있습니다.
- 여기서 캡슐화는 정상적으로 동작합니다(다른 곳에서 단일 함수로 문자열 해석을 구현할 수 있다고 생각되는 경우 이 솔루션이 OOP 패러다임에 훨씬 적합합니다).
cls
클래스 자체이며 클래스의 인스턴스가 아닙니다.꽤 멋진데 만약 우리가 우리의 유산을 물려받으면Date
가 '반 '반', '반'을 갖게 됩니다.from_string
정의되어 있습니다.
정적 방식
★★는?staticmethod
거의 비슷해요.classmethod
(클래스 메서드나 인스턴스 메서드와 같이) 필수 파라미터는 사용하지 않습니다.
다음 사용 사례를 살펴보겠습니다.
어떻게든 검증하고 싶은 날짜 문자열이 있습니다.은 또한 돼 있습니다.Date
지금까지 사용한 클래스는 인스턴스화할 필요가 없습니다.
여기가 바로staticmethod
유용할 수 있습니다.하다
@staticmethod
def is_date_valid(date_as_string):
day, month, year = map(int, date_as_string.split('-'))
return day <= 31 and month <= 12 and year <= 3999
# usage:
is_date = Date.is_date_valid('11-09-2012')
즉, 의 사용법에서 알 수 있듯이staticmethod
할 수 및 내부( 및 메서드)에는 할 수 기본적으로 메서드와 같은 구문론적으로 불리는 함수일 뿐이지만 오브젝트 및 그 내부(필드 및 기타 메서드)에 대한 접근권은 없습니다.classmethod
습니니다
로스티슬라브 징코의 대답은 매우 적절하다.이 다른 를 하나 더 할 수 것 @classmethod
에 걸쳐서@staticmethod
추가 생성자를 생성할 때 사용합니다.
이 예에서 로스티슬라프는@classmethod
from_string
Date
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ 해서 할 수 요.@staticmethod
아래 코드에 나타나 있듯이
class Date:
def __init__(self, month, day, year):
self.month = month
self.day = day
self.year = year
def display(self):
return "{0}-{1}-{2}".format(self.month, self.day, self.year)
@staticmethod
def millenium(month, day):
return Date(month, day, 2000)
new_year = Date(1, 1, 2013) # Creates a new Date object
millenium_new_year = Date.millenium(1, 1) # also creates a Date object.
# Proof:
new_year.display() # "1-1-2013"
millenium_new_year.display() # "1-1-2000"
isinstance(new_year, Date) # True
isinstance(millenium_new_year, Date) # True
해서 둘 다new_year
★★★★★★★★★★★★★★★★★」millenium_new_year
의 인스턴스입니다.Date
를 누릅니다
.Date
어떤 일이 있어도 말이죠. 뜻인가 하면, ''가 '이렇게 하면Date
는 플레인 「Subclass」를 계속 합니다.Date
오브젝트(서브클래스의 속성 없음).이치노
class DateTime(Date):
def display(self):
return "{0}-{1}-{2} - 00:00:00PM".format(self.month, self.day, self.year)
datetime1 = DateTime(10, 10, 1990)
datetime2 = DateTime.millenium(10, 10)
isinstance(datetime1, DateTime) # True
isinstance(datetime2, DateTime) # False
datetime1.display() # returns "10-10-1990 - 00:00:00PM"
datetime2.display() # returns "10-10-2000" because it's not a DateTime object but a Date object. Check the implementation of the millenium method on the Date class for more details.
datetime2
는 의 아닙니다.DateTime
WTF? 、 、 w w@staticmethod
코코데데
대부분의 경우 이는 바람직하지 않습니다. "Factory"를 선택합니다.@classmethod
그게 네게 필요한 거야
「」의 개서Date.millenium
중 임) : (이 부분만 변경됨 : (이 부분 변경)
@classmethod
def millenium(cls, month, day):
return cls(month, day, 2000)
「 」가, 「 」를 .class
하드코드가 아니라 학습된 것입니다. cls
는 임의의 서브클래스가 될 수 있습니다. 결과, 「」가 됩니다.object
한 가 될 것이다cls
.
테스트해 보겠습니다.
datetime1 = DateTime(10, 10, 1990)
datetime2 = DateTime.millenium(10, 10)
isinstance(datetime1, DateTime) # True
isinstance(datetime2, DateTime) # True
datetime1.display() # "10-10-1990 - 00:00:00PM"
datetime2.display() # "10-10-2000 - 00:00:00PM"
그 이유는 아시다시피@classmethod
was was was사 was was was was was was was was was 。@staticmethod
@classmethod
의미: 이 메서드가 호출되면 해당 클래스의 인스턴스가 아닌 첫 번째 인수로 클래스를 전달합니다(일반적으로 메서드에서처럼).즉, 특정 인스턴스가 아닌 해당 메서드 내에서 클래스 및 해당 속성을 사용할 수 있습니다.
@staticmethod
즉, 이 메서드가 호출될 때 클래스의 인스턴스를 전달하지 않습니다(일반적으로 메서드에서처럼).즉, 함수를 클래스 내에 넣을 수는 있지만 해당 클래스의 인스턴스에 액세스할 수는 없습니다(이 기능은 메서드가 인스턴스를 사용하지 않을 때 유용합니다).
각 사용 시기
@staticmethod
함수는 클래스 내에서 정의된 함수에 지나지 않습니다.먼저 클래스를 인스턴스화하지 않고 호출할 수 있습니다.그 정의는 상속을 통해 불변합니다.
- Python은 오브젝트의 bound-method를 인스턴스화할 필요가 없습니다.
- @staticmethod를 보면 메서드가 오브젝트 자체의 상태에 의존하지 않는다는 것을 알 수 있습니다.
@classmethod
또한 클래스를 인스턴스화하지 않고 호출할 수 있지만, 그 정의는 하위 클래스를 따르며 상속을 통해 상위 클래스가 아닌 하위 클래스로 재정의할 수 있습니다. 첫 첫 번째 인수는요.@classmethod
함수는 항상 다음과 같아야 합니다.cls (class)
.
- 일종의 전처리를 사용하여 클래스의 인스턴스를 만드는 데 사용되는 팩토리 메서드입니다.
- 정적 메서드를 호출하는 정적 메서드: 정적 메서드를 여러 정적 메서드로 분할하는 경우 클래스 이름을 하드 코드하지 말고 클래스 메서드를 사용해야 합니다.
여기 이 주제에 대한 좋은 링크가 있습니다.
「 」의
@classmethod
★★★★★★★★★★★★★★★★★」@staticmethod
- 메서드는 개체의 네임스페이스에 있는 함수로, 속성으로 액세스할 수 있습니다.
- 인스턴스라고 ).
self
를 암묵적인 첫 번째 인수로 지정합니다. - 클래스 메서드는 클래스를 가져옵니다(통상은 클래스라고 부릅니다).
cls
를 암묵적인 첫 번째 인수로 지정합니다. - 스태틱 메서드는 (일반 함수와 같이) 암묵적인 첫 번째 인수를 얻지 않습니다.
언제 사용해야 하는지, 왜 사용해야 하는지, 어떻게 사용해야 하는지.
당신은 어느 장식가도 필요 없습니다.단, 함수에 대한 인수 수를 최소화해야 한다는 원칙('Clean Coder' 참조)에서는 인수 수를 최소화해야 합니다.
class Example(object):
def regular_instance_method(self):
"""A function of an instance has access to every attribute of that
instance, including its class (and its attributes.)
Not accepting at least one argument is a TypeError.
Not understanding the semantics of that argument is a user error.
"""
return some_function_f(self)
@classmethod
def a_class_method(cls):
"""A function of a class has access to every attribute of the class.
Not accepting at least one argument is a TypeError.
Not understanding the semantics of that argument is a user error.
"""
return some_function_g(cls)
@staticmethod
def a_static_method():
"""A static method has no information about instances or classes
unless explicitly given. It just lives in the class (and thus its
instances') namespace.
"""
return some_function_h()
인스턴스 메서드와 클래스 메서드 모두에서 적어도1개의 인수를 받아들이지 않는 것은 TypeError이지만 해당 인수의 의미를 이해하지 못하는 것은 사용자 오류입니다.
(正意))some_function
§:
some_function_h = some_function_g = some_function_f = lambda x=None: x
이 방법은 유효합니다.)
인스턴스 및 클래스에 대한 도트 검색:
인스턴스의 닷이 있는 룩업은 다음 순서로 수행됩니다.
- 클래스 네임스페이스의 데이터 기술자(속성 등)
- 내의 " " " "
__dict__
- 클래스 네임스페이스에 데이터가 아닌 기술자(예: 이름 공간)가 있습니다.
인스턴스의 닷이 있는 룩업은 다음과 같이 실행됩니다.
instance = Example()
instance.regular_instance_method
및 메서드는 호출 가능한 속성입니다.
instance.regular_instance_method()
인스턴스 메서드
, " " "self
은 닷 검색을 통해 암묵적으로 제공됩니다.
클래스의 인스턴스에서 인스턴스 메서드에 액세스해야 합니다.
>>> instance = Example()
>>> instance.regular_instance_method()
<__main__.Example object at 0x00000000399524E0>
클래스 메서드
, " " "cls
은 도트 검색을 통해 암묵적으로 제공됩니다.
인스턴스 또는 클래스(또는 하위 클래스)를 통해 이 메서드에 액세스할 수 있습니다.
>>> instance.a_class_method()
<class '__main__.Example'>
>>> Example.a_class_method()
<class '__main__.Example'>
정적 방식
암묵적으로 인수는 주어지지 않습니다.이 메서드는 조회할 수 있다는 점을 제외하고 모듈의 네임스페이스에 정의된 함수(예를 들어)와 동일하게 작동합니다.
>>> print(instance.a_static_method())
None
다시 말씀드리지만, 언제 사용해야 하며, 왜 사용해야 합니까?
이들 각각은 메서드와 인스턴스 메서드를 주고받는 정보에서 점점 더 제한적입니다.
정보가 필요 없을 때 사용하세요.
이것에 의해, 기능이나 메서드를 보다 간단하게 추론해 낼 수 있게 됩니다.
어떤 것이 더 쉽게 추론할 수 있습니까?
def function(x, y, z): ...
또는
def function(y, z): ...
또는
def function(z): ...
인수가 적은 함수는 추론하기 쉽습니다.그것들은 또한 분리하기가 더 쉽다.
인스턴스, 클래스 및 정적 메서드와 유사합니다.예를 들면, 그 클래스도 있습니다.다시 한 번 물어보세요.어떤 것이 더 이해하기 쉽습니까?
def an_instance_method(self, arg, kwarg=None):
cls = type(self) # Also has the class of instance!
...
@classmethod
def a_class_method(cls, arg, kwarg=None):
...
@staticmethod
def a_static_method(arg, kwarg=None):
...
빌트인
다음은 마음에 드는 빌트인 예시입니다.
str.maketrans
는 static method의 입니다.string
할 수 있지만, 「모듈」에서 할 수 것이 훨씬 합니다.str
임스스네
>>> 'abc'.translate(str.maketrans({'a': 'b'}))
'bbc'
dict.fromkeys
키: 된 새 사전을 반환합니다.
>>> dict.fromkeys('abc')
{'a': None, 'c': None, 'b': None}
서브클래스를 지정하면 클래스 메서드로 클래스 정보를 얻을 수 있습니다.이것은 매우 편리합니다.
>>> class MyDict(dict): pass
>>> type(MyDict.fromkeys('abc'))
<class '__main__.MyDict'>
조언 - 결론
class 인수나 instance 인수가 필요하지 않지만 함수가 객체의 사용과 관련이 있고 함수가 객체의 네임스페이스에 있는 것이 편리할 때는 정적 메서드를 사용합니다.
인스턴스 정보가 필요하지 않지만 클래스 정보가 다른 클래스나 정적 메서드에 필요한 경우 또는 생성자로서의 클래스 정보가 필요한 경우 클래스 메서드를 사용하십시오.(여기에서는 서브클래스를 사용할 수 있도록 클래스를 하드코드하지 않습니다).
''는 '우리'를 합니다.@classmethod
「콜링 클래스」는 것에 해 주세요.클래스 메서드의 콜클래스에 대한 참조가 있음을 기억하십시오.
static을 사용하는 동안 하위 클래스에 걸쳐 동작이 변경되지 않도록 할 수 있습니다.
예:
class Hero:
@staticmethod
def say_hello():
print("Helllo...")
@classmethod
def say_class_hello(cls):
if(cls.__name__=="HeroSon"):
print("Hi Kido")
elif(cls.__name__=="HeroDaughter"):
print("Hi Princess")
class HeroSon(Hero):
def say_son_hello(self):
print("test hello")
class HeroDaughter(Hero):
def say_daughter_hello(self):
print("test hello daughter")
testson = HeroSon()
testson.say_class_hello() #Output: "Hi Kido"
testson.say_hello() #Outputs: "Helllo..."
testdaughter = HeroDaughter()
testdaughter.say_class_hello() #Outputs: "Hi Princess"
testdaughter.say_hello() #Outputs: "Helllo..."
약간의 편집
@staticmethod 호출 대상 객체를 참조하지 않고 클래스 내에서 메서드를 쓰는 방법입니다.따라서 self나 cls와 같은 암묵적인 주장을 전달할 필요가 없습니다.클래스 외부에 기술된 것과 동일하게 기술되어 있지만, 이 메서드가 클래스의 일부가 되어야 하기 때문에 클래스 내에 메서드를 캡슐화할 필요가 있는 경우 @staticmethod가 편리하기 때문에 python에서는 사용할 수 없습니다.
@classmethod 공장 메서드를 작성할 때 중요하며 이 커스텀 속성을 클래스에 첨부할 수 있습니다.이 속성은 상속된 클래스에서 재정의할 수 있습니다.
이 두 가지 방법의 비교는 다음과 같습니다.
@classmethod
@classmethod
해도 __init__
또하시면 될 것 같아요.__init__()
이 cpython c++로 하는 방법입니다.
class C:
def __init__(self, parameters):
....
@classmethod
def construct_from_func(cls, parameters):
....
obj1 = C(parameters)
obj2 = C.construct_from_func(parameters)
다의 첫 것에 해 주세요.__init__
self
construct_from_func
cls
종래에
@static 방식
@staticmethod
해도 object method
class C:
def __init__(self):
....
@staticmethod
def static_method(args):
....
def normal_method(parameters):
....
result = C.static_method(parameters)
result = obj.normal_method(parameters)
누군가에게 유용할 수도 있는 약간 다른 사고방식...클래스 메서드는 슈퍼클래스에서 사용되며 다른 자식 클래스에서 메서드가 호출될 때 해당 메서드가 어떻게 동작해야 하는지 정의합니다.스태틱 메서드는 호출하는 자녀 클래스에 관계없이 동일한 것을 반환할 때 사용됩니다.
저는 이 사이트에서는 초보자이기 때문에 위의 답변을 모두 읽고 원하는 정보를 얻을 수 있습니다.하지만, 저는 상향 투표할 권리가 없습니다.그래서 Stack Overflow를 이해하고 있는 답변으로 시작하고 싶습니다.
@staticmethod
의 첫 번째@staticmethod
★★★★★★★★★★★★★★★★★」@classmethod
class variable로 할 수 .@staticmethod
클래스 수 어떤의 '의 속성'에 영향을 줍니다. 클래스 함수는 이 함수는 기본 클래스 함수로 있습니다.이 함수는 '불변의 속성'으로 둘러싸여 있습니다.@staticmethod
데코레이터@classmethod
needs 할 수 되지 않습니다)는 첫 번째 입니다.@classmethod
방식으로 되는 서브클래스 함수의 할 수 서브클래스 상속은 베이스 클래스 함수의 효과를 변경할 수 있습니다.@classmethod
랩된 기본 클래스 함수를 다른 하위 클래스로 덮어쓸 수 있습니다.
즉, @classmethod는 일반 메서드를 공장 방식으로 바꿉니다.
예를 들어 살펴보겠습니다.
class PythonBook:
def __init__(self, name, author):
self.name = name
self.author = author
def __repr__(self):
return f'Book: {self.name}, Author: {self.author}'
@class 메서드를 사용하지 않으면 인스턴스를 하나씩 생성해야 합니다.이러한 인스턴스는 분산되어 있습니다.
book1 = PythonBook('Learning Python', 'Mark Lutz')
In [20]: book1
Out[20]: Book: Learning Python, Author: Mark Lutz
book2 = PythonBook('Python Think', 'Allen B Dowey')
In [22]: book2
Out[22]: Book: Python Think, Author: Allen B Dowey
예를 들어 @classmethod의 경우
class PythonBook:
def __init__(self, name, author):
self.name = name
self.author = author
def __repr__(self):
return f'Book: {self.name}, Author: {self.author}'
@classmethod
def book1(cls):
return cls('Learning Python', 'Mark Lutz')
@classmethod
def book2(cls):
return cls('Python Think', 'Allen B Dowey')
테스트:
In [31]: PythonBook.book1()
Out[31]: Book: Learning Python, Author: Mark Lutz
In [32]: PythonBook.book2()
Out[32]: Book: Python Think, Author: Allen B Dowey
클래스 정의 내에서 인스턴스가 성공적으로 생성되어 함께 수집됩니다.
결론적으로 @classmethod decorator는 기존 방식을 공장 방식으로 변환합니다.classmethod를 사용하면 필요한 만큼 다른 생성자를 추가할 수 있습니다.
클래스 메서드는 클래스에 바인딩된 클래스 상태를 수정할 수 있으며 매개 변수로 cls를 포함합니다.
정적 메서드는 클래스 상태를 수정할 수 없습니다. 클래스에 바인딩되어 클래스 또는 인스턴스를 알 수 없습니다.
class empDetails:
def __init__(self,name,sal):
self.name=name
self.sal=sal
@classmethod
def increment(cls,name,none):
return cls('yarramsetti',6000 + 500)
@staticmethod
def salChecking(sal):
return sal > 6000
emp1=empDetails('durga prasad',6000)
emp2=empDetails.increment('yarramsetti',100)
# output is 'durga prasad'
print emp1.name
# output put is 6000
print emp1.sal
# output is 6500,because it change the sal variable
print emp2.sal
# output is 'yarramsetti' it change the state of name variable
print emp2.name
# output is True, because ,it change the state of sal variable
print empDetails.salChecking(6500)
언급URL : https://stackoverflow.com/questions/12179271/meaning-of-classmethod-and-staticmethod-for-beginner
'programing' 카테고리의 다른 글
vuex 상태에서 초기화할 데이터 유형과 시기를 선택하십시오. (0) | 2022.09.14 |
---|---|
Node.js Crypto를 사용하여 HMAC-SHA1 해시를 생성하는 방법은 무엇입니까? (0) | 2022.09.14 |
C 프로그램을 사용하여 머신의 MAC 주소를 얻는 방법은 무엇입니까? (0) | 2022.09.14 |
JavaScript에서 면도기 사용 (0) | 2022.09.13 |
PHP의 문자열 시작 부분에 .=를 추가할 수 있습니까? (0) | 2022.09.13 |