2012-10-09 3 views
0

Python Standard Library의 2 장 자체에 classmethod() 내장 함수가 있음을 나는 여기서 인용하고있다 : -classmethod 내장 함수 - 문서의 문을 이해할 수 없음

클래스 메서드는 클래스를 암시 적 첫 번째 인수로받습니다. 인스턴스 메서드와 마찬가지로 만 인스턴스를받습니다.

좋아, 내가 classmethod 대신 그 클래스의 인스턴스를 나타내는 암시 인수로 self을 복용, 클래스에 대한 구체적인이다, 그래서 충분히 분명이 부분까지, 우리는이 나타내는, cls를 사용 클래스 자체, 그리고 여기 지금 .. 그 classmethod 클래스에

을 결합 나를 혼동이 항목의 뒷부분에있는 다른 문의 : - 클래스 메서드는 파생 클래스에 대한 호출되면

의 파생 클래스 객체는 암시 된 첫 번째 인수로 전달됩니다.

이제 무엇을 의미합니까? 이 상황에서 사용될 때 an objectclassmethod에 실제로 전달한다고 말하고 있습니까? 그러나 이것은 첫 번째 진술 자체와 모순되지 않는다.

누구나 나를 어떻게 이해할 수 있습니까?이 두 문장이 서로 모순없이 어떻게 움직이는 지 이해할 수 있습니까?

는 좀 자원을 찾기 위해 노력하지만, example을 찾을 수는 second case을 보여주는 ..

+1

파생 클래스 의미 아이 수준이 아닌 인스턴스 객체 – fanlix

+0

@fanlix .. 나도 알아,하지만 서면으로 : -'파생 클래스 object' –

+0

클래스도 객체입니다. 문장은 인스턴스 객체에 관한 것이 아니라 클래스 객체에 관한 것입니다. – glglgl

답변

4

클래스는 해당 클래스의 인스턴스와 마찬가지로 모든 기능을 갖춘 1 급 개체입니다 (분명히 동일한 개체는 아니지만). classmethodclass C 일 때 "클래스 개체"를 첫 번째 인수로 받으면 isinstance(<the object>, C)이 참인 개체가 아닌 a를 나타내는 개체를받습니다. 후자는 (클래스) 인스턴스, "클래스 개체"는 클래스 인 객체에 예약되어 있습니다.

두 번째 문장에서는 클래스 메서드가 파생 클래스에서 호출되면 클래스 메서드는 파생 클래스 (AKA "파생 클래스 개체")를 수신하여 다형성 동작을 사용할 수 있음을 간단하게 설명합니다. 예 (파이썬 3, 때문에 f..k 이전 스타일 클래스)의 경우 :

class C: 
    x = 1 

    @classmethod 
    def m(cls): 
     return cls.x 

class D(C): 
    x = 2 

print(C.m()) # 1 
print(D.m()) # 2 
+0

@ 델 난 .. 고마워요. 내 의심을 분명히 해줍니다. :) –

+1

누군가가 궁금한 점이있는 경우, 클래스 객체 그것의 메타 클래스 (디폴트로'type')의 인스턴스입니다. –

2
class A(object): 
    @classmethod 
    def x(cls): return cls 

class B(A): 
    pass 

print B().x() 

을 여기에, 나는 그것의 서브 클래스 B를 통해 A.x()를 호출합니다.

따라서 A에서 파생 된 B 클래스 개체가 반환됩니다.

+0

@glglgl ..즉, 파생 클래스 객체를 통해 기본 클래스의'classmethod'를 호출 할 수 있습니다. –

+0

정확히이 경우입니다. 실제 인스턴스의 클래스 객체가 사용됩니다. 클래스 메소드가 클래스를 통해 그리고 그 클래스의 인스턴스를 통해 호출 될 수 있기 때문에'B.x()'도 실행 가능할 것입니다. 원인의 – glglgl

+0

glglgl 코드에서 다음을 시도하십시오. bb = B(); B.x(); bb.x(); – fanlix

관련 문제