3

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

vector.valuesプログラムで手動で設定されていなくても、Pythonインタープリターがどのようにアクセスできるかは奇妙だと思いますvalues。また、何らかの組み込み変数であるとは思いません。

これは可変クラスの例ですか?私はいつもこの行動がおかしいと思っていました。

4

1 に答える 1

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)
于 2013-02-20T13:34:19.713 に答える