2016-06-11 1 views
2

더 좋은 제목이 없기 때문에 지금까지 제가 가지고있는 것입니다.`int`를 상속받은 클래스는 변수 할당과 같은 이상한 유령이됩니다.

예상대로
class cordinate(int): 
    def __new__(self, *args, **kwargs): 
     self.x = args[0] 
     self.y = args[1] 

     ## Try to get pixel [0,0] and see what it got: 
     if self.x == 0 and self.y == 0: 
      print('New Here') 
      print(self.x, self.y, self.angle, self.distance_from_edge) 

     self.angle = 225 
     self.distance_from_edge = 13 

     args = [self.distance_from_edge,] 
     return super(cordinate, self).__new__(self, *args, **kwargs) 

cordinates = [cordinate(0,0), cordinate(2,10), cordinate(3,8)] 

는,이 코드는 오류 발생 :

if self.x == 2 and self.y == 10: 

이 코드의 출력 : :

New Here 
2 10 225 13 

New Here 
Traceback (most recent call last): 
    File "test.py", line 17, in <module> 
    cordinates = [cordinate(0,0), cordinate(2,10), cordinate(3,8)] 
    File "test.py", line 9, in __new__ 
    print(self.x, self.y, self.angle, self.distance_from_edge) 
AttributeError: type object 'cordinate' has no attribute 'angle' 

어떤 이유를, 나는 다음과 같은 시도

이제 시뮬레이션이 있다고 확신합니다. 이것에 대한 설명과 공포에 대한 필요성이나 귀신을 믿기 시작하는 것이 아닙니다. ..

그러나 나는 그걸 가지고 놀았지만 감각이 없습니다. 이 행동에 대한 설명은 무엇입니까 - 이름이 있습니까? 어떻게 새로 생성 된 인스턴스가 2 행 아래에 설정 될 값을 가질 수 있습니까?

예상 값 : 항상 충돌 - 상단에 정의되지 않은 키가있는 인쇄물을 의도적으로 배치했기 때문에.
파이썬 : 3.5.1 (윈도우 8) 당신이 the data model documentation에서 볼 수 있듯이

+3

__new__'이 ** 클래스 ** (종래'의 CLS입니다 '에 첫 번째 인수 '), 인스턴스가 아닙니다 (일반적으로'self'). 따라서 이러한 속성은 * first * 호출이 충돌하지 않는 한 이미 설정되어 있습니다. – jonrsharpe

+0

@jonrsharpe 당신은 내 체인을 janking거야? 하하. 그것이 간단하다면 나는 생성시이 클래스에'x'와'y'를 어떻게 할당하는지 재평가해야 할 것입니다. – Torxed

+0

관심 없어, '__init__'보다는'__new__'을 사용하는 이유가 있습니까? – Holloway

답변

3

, __new__의 첫 번째 인수는 클래스 (통상적으로 cls), 인스턴스가 아니라 (종래 self)입니다. 따라서 cordinate 클래스에 클래스 속성을 설정하고 있습니다 (각 입력이 아니라 오타이며 클래스 이름은 CamelCased이어야합니다). 첫 번째 전화가 __new__ 인 경우 해당 특성은 모든 후속 호출의 클래스에 설정됩니다. 인스턴스, 예를 일단

당신이 인스턴스가 __new__ 속성을 설정하려는 경우, 그것을 을 수행

class Coordinate(int): 

    def __new__(cls, *args, **kwargs): 
     self = super(Coordinate, cls).__new__(cls, *args[2:], **kwargs) 
     #^or 'inst' or whatever you like 
     self.x, self.y = args[:2] 
     ... 
     return self 
+0

당신은 정확하고 평신도 용어로 설명하고 설명서에 대한 직접적인 포인터를 포함 해 주셔서 감사합니다. 쉽고도 완벽한 답변! 건배! – Torxed