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()
을 사용하지 않음)를 우회하거나 성능을 향상시키고 속성을 찾고 빡빡한 루프에서 메서드를 바인딩하지 않으려는 경우에 유용합니다.
이러한 경우는 드물고 특별하기 때문에 정규 표현식을 사용하고 싶습니다. 이는 자신과 다른 독자 모두를위한 코드 이해를 돕기 때문입니다. 그 독자들을 놀라게하지 마라.
왜냐하면'Class.method()'는 당신을 그 클래스에 묶어 주므로 더 이상 그 메소드를 오버라이드 할 수 없기 때문입니다. –
제목과 질문 본문이 다소 다릅니다. –
@MartijnPieters 맞습니다. 제목을 편집하고 싶을 수도 있습니다. –