假设我有一个类,它有一个成员叫做data,它是一个列表。
我希望能够初始化类,例如,一个文件名(包含初始化列表的数据)或一个实际的列表。
你的技巧是什么?
你只是通过查看__class__来检查类型吗?
我是不是漏掉了什么技巧?
我习惯了c++,在那里根据参数类型重载很容易。
假设我有一个类,它有一个成员叫做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)
你可能需要isinstance内置函数:
self.data = data if isinstance(data, list) else self.parse(data)
非常好的问题。我也解决了这个问题,虽然我同意“工厂”(类方法构造函数)是一个很好的方法,但我想建议另一个我也发现非常有用的方法:
下面是一个示例(这是一个read方法而不是构造函数,但思想是相同的):
def read(self, str=None, filename=None, addr=0):
""" Read binary data and return a store object. The data
store is also saved in the interal 'data' attribute.
The data can either be taken from a string (str
argument) or a file (provide a filename, which will
be read in binary mode). If both are provided, the str
will be used. If neither is provided, an ArgumentError
is raised.
"""
if str is None:
if filename is None:
raise ArgumentError('Please supply a string or a filename')
file = open(filename, 'rb')
str = file.read()
file.close()
...
... # rest of code
这里的关键思想是使用Python对命名参数的出色支持来实现这一点。现在,如果我想从文件中读取数据,我说:
obj.read(filename="blob.txt")
为了从字符串中读取它,我说:
obj.read(str="\x34\x55")
这样用户就只有一个方法可以调用。如您所见,在内部处理它并不过于复杂
好了,好了。我只是用一个元组拼凑了这个例子,而不是文件名,但这很简单。谢谢所有。
class MyData:
def __init__(self, data):
self.myList = []
if isinstance(data, tuple):
for i in data:
self.myList.append(i)
else:
self.myList = data
def GetData(self):
print self.myList
A = [1,2]
B = (2,3)
c = MyData(a)
d = MyData(b)
c.GetData()
d.GetData()
[1, 2]
[2, 3]
快速和肮脏的修复
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()