수업 방법 1
@classmethod
클래스 메소드를 포장하는 방법에 관한 것입니다.
첫 번째 인수로서 예에있어서 자신의 예로서, 첫 번째 인자 자체에 클래스 클래스 방법. 선언 클래스 메서드에 다음과 같은 습관을 사용하십시오 :
class C:
@classmethod
def f(cls, arg1, arg2, ...): ...
장식 등 @classmethod 호출 된 함수를 형성 - 자세한 내용은 함수 정의를 참조하십시오.
자신의 클래스의 종류 외부의 예는 무시됩니다. 파생 된 클래스의 메소드 호출 클래스에 속하는 경우 첫번째 인수가 암시 적으로 파생 클래스 객체가 전달된다.
C ++ 자바 클래스 메소드와 정적 메소드 또는 다른. 당신이 후자를해야하는 경우, StaticMethod를 ()을 참조하십시오.
이 정적 메소드
@staticmethod
정적 메소드로서 전송 방법.
정적 메소드를 선언하려면 다음 구문을 사용합니다
class C:
@staticmethod
def f(arg1, arg2, ...): ...
장식 등 @staticmethod 호출 된 함수를 형성 - 자세한 내용은 함수 정의를 참조하십시오.
Python과 Java 또는 C ++ 정적 메서드의 정적 방법은 비슷합니다. ) (classmethod를 참조 대체 클래스 생성자 변종을 만드는 데 사용됩니다.
모든 장식이 좋아하는 것처럼, 당신은 또한 기존의 StaticMethod를 같은 함수를 호출하고, 그 결과에 대한 몇 가지 작업을 수행 할 수 있습니다. 이러한 기능은 몸에서 당신이 예를 메소드에 자동 변환을 피하고 싶은 경우에 클래스를 참조 할 필요가있다. 이 경우,이 구문을 사용합니다 :
class C:
builtin_open = staticmethod(open)
정적 방법에 대한 자세한 내용은 표준 유형 계층 구조를 참조하십시오.
3 차이
- 다른 구성 : 클래스 수준의 방법은 자신의 첫 번째 인수의 CLS 같은 요구는, 정적 방법은 암시 적 첫 번째 매개 변수, 첫 번째 인수 자체로 방법의 예를 자체 인스턴스를 수신하지 않습니다
- 직접 호출 할 수있는 두 개의 다른 클래스에 의존하면서 여전히 클래스 인스턴스 메소드를 생성하고 고정 방법이 사용될 수있는 방법 한 후 예를 들면, 인스턴스의 생성 후에 호출해야;
- 자바 클래스 생성자 아날로그 자바 생성자를 복수 형성하는 경우에, 파이썬 클래스 메소드를 오버로드 할 수있다;
- 인스턴스가 생성 된 후에 상기 새로운 정적 메소드를 생성하지 않고 설계된 클래스 및 인스턴스는 상위 클래스를 이용하여, 호출 될 수있는 정적 메소드는 자바 파이썬 사용;
- 정적 방법 시나리오 : 당신이 순수 매개 변수 및 반환 데이터의 기능 방법을 전달하여, 방법에서 인스턴스 메서드와 속성에 액세스하지 않는 경우, 다음이 정의 정적 메서드에 적합, 그것은 객체 인스턴스화의 오버 헤드를 저장 비용이 방법은 종종 모듈 레이어의 존재의 함수로서 클래스의 바깥쪽에 문제 없지만, 종류, 서비스의 종류에 대한.
- 방법 클래스 사용 시나리오 : 1, 예를 들어 객체의 인스턴스를 생성하는 팩토리 메소드로, 내장되어 널리 공장 방법으로 사용 모듈 datetime.date 클래스의 클래스 메소드, 날짜 객체를 생성하기 위해. 당신은 클래스 내부의 정적 메소드를 호출하려면 정적 메소드로 정의 된 경우 때문에 2, 다음 클래스 메소드로 정의하는 방법은 다음 명시 적으로 클래스 A를 참조 할 필요, 적합,이 상속에 대한 좋은 것은 아니다 .
# coding:utf-8
class Foo(object):
"""类三种方法语法形式"""
x,y = 10,14
def instance_method(self):
pass
@staticmethod
def static_method_averag(*mixes):
return sum(mixes) / len(mixes)
@classmethod
def class_method(cls):
return cls.static_method_averag(cls.x,cls.y)
foo = Foo()
# 调用关系
# foo.instance_method()
# foo.static_method_averag(1,2,3)
# foo.class_method()
# print('----------------')
# Foo.static_method_averag(1,2,3)
# Foo.class_method()
# print('----------------')
# 内存关系
print(Foo.static_method_averag is foo.static_method_averag) #静态方法不会动
print(Foo.class_method is foo.class_method)
print(Foo.instance_method is foo.instance_method) #实例化后 实例绑定这个方法
참조 :
https://zhuanlan.zhihu.com/p/28010894
https://docs.python.org/zh-cn/3/index.html