假设我有一个类,它有一个成员叫做data,它是一个列表。

我希望能够初始化类,例如,一个文件名(包含初始化列表的数据)或一个实际的列表。

你的技巧是什么?

你只是通过查看__class__来检查类型吗?

我是不是漏掉了什么技巧?

我习惯了c++,在那里根据参数类型重载很容易。


当前回答

快速和肮脏的修复

class MyData:
    def __init__(string=None,list=None):
        if string is not None:
            #do stuff
        elif list is not None:
            #do other stuff
        else:
            #make data empty

然后你可以用

MyData(astring)
MyData(None, alist)
MyData()

其他回答

更好的方法是使用isinstance和type转换。如果我没理解错的话,你想要的是

def __init__ (self, filename):
    if isinstance (filename, basestring):
        # filename is a string
    else:
        # try to convert to a list
        self.path = list (filename)

你为什么不更像蟒蛇?

class AutoList:
def __init__(self, inp):
    try:                        ## Assume an opened-file...
        self.data = inp.read()
    except AttributeError:
        try:                    ## Assume an existent filename...
            with open(inp, 'r') as fd:
                self.data = fd.read()
        except:
            self.data = inp     ## Who cares what that might be?

你可能需要isinstance内置函数:

self.data = data if isinstance(data, list) else self.parse(data)

快速和肮脏的修复

class MyData:
    def __init__(string=None,list=None):
        if string is not None:
            #do stuff
        elif list is not None:
            #do other stuff
        else:
            #make data empty

然后你可以用

MyData(astring)
MyData(None, alist)
MyData()

我喜欢的解决方案是:

class MyClass:
    _data = []
    __init__(self,data=None):
        # do init stuff
        if not data: return
        self._data = list(data) # list() copies the list, instead of pointing to it.

然后使用MyClass()或MyClass([1,2,3])调用它。

希望这能有所帮助。编码快乐!