2014-11-22 2 views
0

다른 형식의 하위 클래스를 가져온 경우 기본 클래스의 생성자에서 목록에서 dict로 변경되는 방식을 이해하지 못합니다.수퍼 클래스의 유형을 변경

마법이란 무엇입니까?

class Adder: 
def __init__(self, data = [ ]): 
    self.data = data 
def __add__(self, other): 
    return "Not Implemented" 



class DictAdder(Adder): 
    def __add__(self, y): 
     z = {} 
     for k in self.data.keys(): z[k] = self.data[k] 
     for k in y.keys(): z[k] = y[k] 
     return z 




y = DictAdder({1:'a', 2:'b'}) 
l = y + { 3: 'c', 4: 'd'} 
print(l) 

과 대답 :

{1: 'a', 2: 'b', 3: 'c', 4: 'd'} 

Pycharm 데이터가 목록이기 때문에, self.data.keys은() 속성 키()를 가지고 있겠지이 시도해야합니다 것을 보여 주지만,이 작품

입니다
+0

변수는 파이썬에서 유형이 없습니다. 변수는 모든 유형의 객체를 가리키는 데 사용할 수 있습니다 :'x = 1; x = []; x = 'foo' '. –

+1

[변경할 수있는 기본 인수를 사용하지 마십시오] (http://stackoverflow.com/questions/1132941/least-astonishment-in-python-the-mutable-default-argument) 그렇지 않으면 다른 질문이 게시 될 수 있습니다. 한동안. :-) –

답변

0

data기본적으로은 목록에 있지만 파이썬은 정적 형식의 언어가 아니기 때문에 반드시 필요하지는 않습니다. data은 단지 이름 일뿐입니다. 우리가 가지고 있기 때문에 :

class Adder: 
    def __init__(self, data = [ ]): 
     self.data = data 

우리의 사용을 제한하지 않습니다. 난 여전히 수행 할 수 있습니다

i = Adder(4) 
s = Adder('hello') 
d = Adder({1: 2}) 
o = Adder(SomeOtherType()) 

을만큼 사용 어떤 Adder.data 될 일이 유형에 대해 올바르게 사용한다. 이 경우 DictAdderdatadict으로 해석하므로 정상적으로 작동합니다. 물론 DictAdder이 아닌 dict으로 생성하려고하면 오류가 발생합니다.

+0

예, 목록이나 다른 형식의 DictAdder를 얻는다면 오류가 있습니다. 그러나, 이것은 내가 쓰는 좋은 해결책인가? 아니면 다른 해결책이 있습니까? –

+1

@VladPakin 무엇? – Barry

관련 문제