무엇 단지 루비에서 오는 나를 때리는 것은, 소위이다 수업 방법 및 소위 인스턴스 방법은 경우에 자동으로 전달되는 첫 번째 매개 변수에 적용 의미 론적 의미를 단지 함수 기능을 하는 방법으로 호출 의 객체 (예 obj.meth()
).
일반적으로 해당 객체 는 인스턴스 여야하지만 @classmethod
메소드 데코레이터 는 클래스를 전달하도록 규칙을 변경합니다. 인스턴스에서 클래스 메소드를 호출 할 수 있습니다 (단지 함수 일뿐입니다). 첫 번째 인수는 클래스입니다.
함수일 뿐이므로 주어진 범위 (즉, class
정의) 에서 한 번만 선언 할 수 있습니다 . 따라서 Rubyist에게 놀랍게도 같은 이름의 클래스 메소드와 인스턴스 메소드를 가질 수 없습니다 .
이걸 고려하세요:
class Foo():
def foo(x):
print(x)
foo
인스턴스를 호출 할 수 있습니다
Foo().foo()
<__main__.Foo instance at 0x7f4dd3e3bc20>
그러나 수업이 아닙니다.
Foo.foo()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unbound method foo() must be called with Foo instance as first argument (got nothing instead)
이제 추가하십시오 @classmethod
:
class Foo():
@classmethod
def foo(x):
print(x)
인스턴스를 호출하면 이제 해당 클래스를 전달합니다.
Foo().foo()
__main__.Foo
수업을 부르는 것처럼 :
Foo.foo()
__main__.Foo
self
인스턴스 메소드와 cls
클래스 메소드에서 첫 번째 인수에 사용하도록 지시하는 것은 컨벤션뿐입니다 . 나는 단지 그것이 단지 논쟁이라는 것을 설명하기 위해 여기를 사용하지 않았다. 루비에서, self
A는 키워드.
루비와 대조 :
class Foo
def foo()
puts "instance method #{self}"
end
def self.foo()
puts "class method #{self}"
end
end
Foo.foo()
class method Foo
Foo.new.foo()
instance method #<Foo:0x000000020fe018>
Python 클래스 메소드는 단지 꾸며진 함수 이며 동일한 기술을 사용하여 자신 만의 데코레이터 를 작성할 수 있습니다 . 데코 레이팅 된 메소드는 실제 메소드를 랩핑합니다 ( @classmethod
추가 클래스 인수를 전달하는 경우 ). 기본 방법은 아직 숨겨져 있지만 여전히 액세스 할 수 있습니다 .
각주 : 클래스와 인스턴스 메소드 사이의 이름 충돌로 호기심이 생겼습니다. 나는 파이썬 전문가와 거리가 멀며, 이것 중 하나라도 잘못되면 의견을 원합니다.