2017-04-06 1 views
1

나는 부모와 자식의 두 클래스를 만들었습니다. 부모 클래스를 사용하여 자식 클래스를 초기화 할 수 있는지 알고 싶습니다.수퍼 클래스의 인스턴스에서 하위 클래스의 인스턴스를 만드는 방법은 무엇입니까?

class Pc: 

    def __init__(self, brand, processor, price): 
     self.brand = brand 
     self.processor = processor 
     self.price = price 

class Laptop(Pc): 
    def __init__(self,brand,processor,price, battery): 
     Pc.__init__(self,brand,processor,price) 
     self.battery = battery 

지금 내가 가진 노트북 클래스를 초기화 할 수 있습니다 :

b = Laptop('brand','processor','price') 

하지만 그건 나에게 많이 사용하지 않는 것 그리고 선생님이 아주 잘 설명하지 않은이 내 코드입니다. 나는 이런 식으로 할 수 있는지 알고 싶다.

a = Pc("brand","processor","price") 
b = Laptop(a, "battery") 

내 코드로 이것을 시도하면 오류가 발생한다. 이것을 할 수 있습니까?

+1

당신은'데프 __init __ (자기, PC, 배터리를 정의 할 수 있습니다) :'그런 다음'pc' 인수에서'Pc' 속성을 복사하십시오. – Barmar

+1

오류는'Laptop .__ init__'을 4 개의 인수를 받아서 정의했다는 것입니다. 두 개만 넘겨 주면됩니다. 전달하고자하는 인수를 취할 함수를 다시 정의해야합니다. – Aaron

+0

노트북 초기화를 수정할 수 있습니다. * argv 당신이 가지고있는 인자의 수에 따라 어떤 식 으로든 일을 하든지, 아니면 대안적인 생성자로서이 클래스를위한 클래스 메쏘드를 만드십시오. – Copperfield

답변

3

당신은 할 수 있습니다 :

class Laptop(Pc): 
    def __init__(self, pc, battery): 
     Pc.__init__(self, pc.brand, pc.processor, pc.price) 
     self.battery = battery 

이것은 생성자에주는 pc 인수에서 상속 된 속성을 초기화합니다.

짧은 또는 긴 방법을 사용하려면 컨스트럭터를 키워드 인수로 정의한 다음 if 문을 사용하여 사용 된 양식에 따라 Pc.__init__()을 적절하게 호출해야합니다.

0

당신은 다소 hackish 방법으로 그것을 수행

import copy 
a = Pc("brand","processor","price") 
b = copy.deepcopy(a) 
b.__class__ = Laptop() 
b.battery = battery 
1

당신이 그것을 자신을하거나 타사 솔루션을 찾을 수있다, 그래서 당신이 원하는 것을 달성하기 위해 파이썬에 내장 된 메커니즘이 없습니다 .

이 할 수있는 좋은 방법은 내가 개체 복제 할 수있는 슈퍼 클래스의 클래스 메소드 추가하는 것입니다 걸릴 수 있다는 것입니다 :

class Pc: 

    @classmethod 
    def clone(cls, target, *extra_args, **extra_kwargs): 
     return cls(
      target.brand, target.processor, target.price, *extra_args, 
      **extra_kwargs) 

    def __init__(self, brand, processor, price): 
     self.brand = brand 
     self.processor = processor 
     self.price = price 


class Laptop(Pc): 

    def __init__(self, brand, processor, price, battery): 
     super(Laptop, self).__init__(brand, processor, price) 
     self.battery = battery 


a = Pc("brand","processor","price") 
b = Laptop.clone(a, 'battery') 

print(b.battery) 

을하지만 당신은 당신이 초기화에 문제로 실행하기 시작 찾을 수 있습니다 인수. 를 추가하는 동안

a = Pc() 
a.brand = 'brand' 
# etc. 
1

, 당신이 현재 동작을 keepthe하려면이

  1. 에 대한 몇 가지 옵션이 있습니다 : 나는 최소한으로 __init__()에 필요한 인수를 유지하고 이후에 필요한 속성을 구성하는 것이 좋습니다 새, 당신은

    class Laptop(Pc): 
        def __init__(self, *argv): 
         if len(argv) == 4: #the current one 
          brand, processor, price, battery = argv 
         elif len(argv) == 2: #the new one 
          pc, battery = argv 
          brand, processor, price = pc.brand, pc.processor, pc.price 
         else: 
          raise TypeError 
        Pc.__init__(self,brand,processor,price) 
        self.battery = battery  
    

    같은 예를 들어, *의 인수를 사용하고

    처럼 간단 사용할 수 있습니다 이 하나를 사용하는이 경우

    class Laptop(Pc): 
    
        def __init__(self,brand,processor,price, battery): 
         Pc.__init__(self,brand,processor,price) 
         self.battery = battery 
    
        @classmethod 
        def from_pc_and_battery(cls, pc, battery): 
         return cls(pc.brand, pc.processor, pc.price, battery) 
    

    을 처리하는 클래스 메소드를 만드는 는

    a = Pc("brand","processor","price") 
    b = Laptop(a, "battery") 
    
  2. ,처럼이

    a = Pc("brand","processor","price") 
    b = Laptop.from_pc_and_battery(a, "battery") 
    
관련 문제