2013-02-20 3 views
3

Я читал несколько конструкторов Полиморфизм в Python. Я наткнулся на это code.Полиморфизм и поведение конструктора в Python

import sys, types, pprint 

class Vector: 
    """ 
    Demo of a class with multiple signatures for the constructor 
    """ 
    def __init__(self, *args, **kwargs): 

     if len(args) == 1: foundOneArg = True; theOnlyArg = args[0] 
     else:    foundOneArg = False; theOnlyArg = None 

     if foundOneArg and isinstance(theOnlyArg, types.ListType):  
      self.initializeFromList(theOnlyArg)    
     elif foundOneArg and isinstance(theOnlyArg,Vector): 
      self.initializeFromVector(theOnlyArg)   
     else: 
      self.initializeFromArgs(*args) 

     pprint.pprint(self.values) # for debugging only 

    def initializeFromList(self, argList): 
     self.values = [x for x in argList] 

    def initializeFromVector(self, vector): 
     self.values = [x for x in vector.values] 

    def initializeFromArgs(self, *args): 
     self.values = [x for x in args] 
#------------ end of class definition --------------------- 

v = Vector(1,2,3) 
v = Vector([4,5,6]) 
q = Vector(v); 

Однако, я не понимаю, как переменная vector.values была установлена ​​в определении функции от initializeFromVector.

Мне кажется странным, как интерпретатор Python имеет доступ к vector.values, хотя он не установлен вручную в программе, и я не думаю, что values является встроенной переменной.

Это пример изменчивого класса? Я всегда думал, что это поведение было странным.

ответ

4

Это очень просто, действительно: initializeFromVector принимает аргумент типа vector и ищет его values участник. Это должно быть установлено ранее, когда было построено vector.

В качестве более простого примера:

from copy import copy 

class Set(object): 
    def __init__(self, other=None): 
     """Initialize; optionally copy the elements of another Set.""" 
     self.elements = set() 
     if other is not None: 
      self.elements = copy(other.elements) 
+0

DOH! Я знал, что чего-то не хватает, это было очень тривиально! – garak

Смежные вопросы