2017-11-21 3 views
2

의) self.method를 (사용하는 것을 선호 할 유효 :왜 우리가 어떤 클래스 대신 Class.method (자기) 예를 들어

instance.something()  # normal 
Class.something(instance) # but also technically valid 

첫 번째 유스 케이스가 선호되는 이유가 있습니까? 인스턴스와 호출 메서드를 반복하는 예제를 생각할 수도 있지만 사용중인 클래스에 대한 명시적인 참조가 표시 될 때 코드를 해석하는 것이 더 쉬운 경우도 생각할 수 있습니다.

이전에 답변을 드렸던 경우 사과드립니다. 나는 그것을 발견 할 수 없었다. 그것은 질문을 표현하는데있어서 나의 어려움 때문일 수있다.

+2

왜냐하면'Class.method()'는 당신을 그 클래스에 묶어 주므로 더 이상 그 메소드를 오버라이드 할 수 없기 때문입니다. –

+0

제목과 질문 본문이 다소 다릅니다. –

+0

@MartijnPieters 맞습니다. 제목을 편집하고 싶을 수도 있습니다. –

답변

6

Class.something(instance)는 특정 클래스의 방법을 잡는다. self.something()은 해당 인스턴스의 클래스를 사용하며 은 반드시 동일한 클래스 인 것은 아닙니다입니다.

또한 클래스 이름을 계속 사용해야하는 경우 많은 것을 반복합니다.

제목에 메서드 내 코드를 나타내는 self이 사용됩니다. 다음 예제의 출력 비교 :

class Animal: 
    def make_sound(self): 
     print('General nature sounds') 

    def startle(self): 
     self.make_sound() 

    def pet(self): 
     Animal.make_sound(self) 

class Dog(Animal): 
    def make_sound(self): 
     # overrides Animal.make_sound() 
     print('Bark!') 

dog = Dog() 
dog.startle() # prints "Bark!" 
dog.pet()  # prints "General nature sounds" 

Animal.make_sound(self) 일을하지만, Dog.make_sound()에 대한 새로운 구현을 무시하고, 원래의 방법을 사용합니다. 당신이 다른 곳 인스턴스에 대한 참조를 가지고있는 경우를 들어

, 당신은 클래스 또는 서브 클래스 동의 경우 고려 : 우리가 Animal의 새로운 서브 클래스가 그래서

class Cat(Animal): 
    def make_sound(self): 
     print('Meouw!') 

def groom_pet(pet): 
    pet.startle() 
    Animal.make_sound(pet) 

groom_pet(Cat()) # prints "Meouw", then "General nature sounds" 

, 그리고 groom_pet() 하위 클래스도 동일한 메소드를 갖기 때문에 Animal 인스턴스를 허용 할 수 있습니다. 그러나 pet.startle()은 오른쪽 make_sound() 구현을 호출하게되고 Animal.make_sound()은 다시 올바른 구현을 무시합니다.

인스턴스에서 바인딩 된 메서드보다 언 바운드 클래스 메서드를 사용해야하는 경우는 거의 없습니다. 이 이유를 사용하는 이유는 가끔입니다. 특히 부모 클래스 메서드 (super().method()을 사용하지 않음)를 우회하거나 성능을 향상시키고 속성을 찾고 빡빡한 루프에서 메서드를 바인딩하지 않으려는 경우에 유용합니다.

이러한 경우는 드물고 특별하기 때문에 정규 표현식을 사용하고 싶습니다. 이는 자신과 다른 독자 모두를위한 코드 이해를 돕기 때문입니다. 그 독자들을 놀라게하지 마라.