2017-10-23 14 views
-1

클래스 메서드 이상 상속 상속에서 사용할 수있는 주요 문제는 무엇입니까? (바보) 예는 다음과 같습니다Python에서 상속을 통한 클래스 상속을 선택하는 문제

class Pizza(object): 
    def __init__(self, ingredients): 
     self.ingredients = ingredients 
     self.cooked = False 

    def cook(self):   
     print "cooking" 
     self.cooked = True 

    # A pepperoni pizza using a factory method 
    @classmethod 
    def Pepperoni(cls): 
     return cls("pepperoni") 

# An onion pizza inheriting from Pizza base class 
class Onion(Pizza): 
    def __init__(self): 
     ingredient = "onion" 
     super(Onion, self).__init__(ingredient) 

나는

  • 내가 (쉽게)
  • 나는 피자를 추상 기본 클래스를 만들 수 없습니다 페퍼로니에 사용자 지정 방법을 추가 할 수 있다는 사실을 알고

다른 건 없나요?

+0

피자가 그 위에 약간의 재료가 아닌 것은 왜 처음부터 * abstract *일까요? 페퍼로니 피자는 페퍼로니가 들어간 양파 피자 나 양파 피자와 어떻게 다릅니 까? –

+0

즉 classmethods와 상속은 완전히 다른 용도로 사용됩니다. –

+0

피자에 대한 기술적 인 설명을 들어주세요. 단지 예제 일뿐입니다. –

답변

1

PepperoniOnion과 같은 클래스로 생각됩니다. Onion이 클래스 인 반면 PepperoniPizza에있는 함수 일뿐입니다. 물론 정상적인 방법으로 Pepperoni을 생각해서는 안되지만 실제로는 그렇습니다. classmethod 데코레이터는 실질적으로 Pepperoni 메서드를 팩토리 함수로 변환하여 새 인스턴스를 생성합니다. 이 코드는 단지 클래스의 외부에서 함수를 작성 완전히 동일합니다 : 당신은 "Pepperoni에 사용자 정의 메소드를 추가"에 대해 이야기하지 않을

def Pepperoni(): 
    return Pizza("pepperoni") 

지금,하지만 정말 아무것도 변경되었습니다.

+0

그래, 그 차이점을 이해하고 있지만, 힘든 시간을 상속을 사용해야하는지 아니면 그냥 classmethods를 만들어야할지 결정하려고 ... 당신이 * 30 가지 종류의 세트를 가진 가게를 위해 * 피자 *를 코딩해야한다고 상상해보십시오. 당신은 무엇을 할 것입니까? –

+0

나는 단순히'ingredients' 인수'Pizza'를 사용합니다 :'pizza_with_onion = Pizza ('onion')'. 재료가 아닌 다른 것으로부터 피자를 인스턴스화해야하는 경우 팩토리 함수를 사용해야합니다. 당신이 피자와 다른 케밥을 만들기로 결정했다면 여전히 새로운 수업이 필요 하겠지만, 여전히 꽤 많은 방법을 공유 할 수 있습니다. –

+0

고마워요! 그 재료가 아닌 다른 것에서 피자를 인스턴스화 할 필요는 없지만 공장 수업을하는 것 같아요 * 어떤 해를 끼치 지 않습니다 =) –