2024-04-19 22:21:22 发布
网友
Possible Duplicate:What is a clean, pythonic way to have multiple constructors in Python?
不可能在Python中定义多个具有不同签名的构造函数吗?如果没有,一般的解决办法是什么?
例如,假设您想要定义一个类City
City
我想可以说someCity = City()或someCity = City("Berlin"),其中第一个只给出默认名称值,第二个定义它。
someCity = City()
someCity = City("Berlin")
如果您的签名只在个数的参数上有所不同,那么使用默认参数是正确的方法。如果你想传递不同类型的参数,我会尽量避免在另一个答案中提到的基于isinstance的方法,而不是使用关键字参数。如果使用just关键字参数变得笨拙,可以将其与classmethods结合使用(bzrlib代码喜欢这种方法)。这只是一个愚蠢的例子,但我希望你能明白:
isinstance
class C(object): def __init__(self, fd): # Assume fd is a file-like object. self.fd = fd @classmethod def fromfilename(cls, name): return cls(open(name, 'rb')) # Now you can do: c = C(fd) # or: c = C.fromfilename('a filename')
注意,所有这些classmethods仍然经过相同的__init__,但是使用classmethods可能比记住要__init__工作的关键字参数的组合要方便得多。
__init__
最好避免使用isinstance,因为python的duck类型使得很难确定实际传入了什么类型的对象。例如:如果要获取文件名或类文件对象,则不能使用isinstance(arg, file),因为有许多类文件对象不是file子类(如从urllib、StringIO或…)返回的类文件对象。通常最好让调用者通过使用不同的关键字参数明确地告诉您对象的含义。
isinstance(arg, file)
file
对于您给出的示例,请使用默认值:
class City: def __init__(self, name="Default City Name"): ... ...
一般来说,您有两种选择:
1)基于类型的Doif-elif块:
if
elif
def __init__(self, name): if isinstance(name, str): ... elif isinstance(name, City): ... ...
2)使用duck类型——也就是说,假设您的类的用户足够聪明,能够正确使用它。这通常是首选方案。
与Java不同,不能定义多个构造函数。但是,如果未传递默认值,则可以定义该值。
def __init__(self, city="Berlin"): self.city = city
如果您的签名只在个数的参数上有所不同,那么使用默认参数是正确的方法。如果你想传递不同类型的参数,我会尽量避免在另一个答案中提到的基于
isinstance
的方法,而不是使用关键字参数。如果使用just关键字参数变得笨拙,可以将其与classmethods结合使用(bzrlib代码喜欢这种方法)。这只是一个愚蠢的例子,但我希望你能明白:注意,所有这些classmethods仍然经过相同的
__init__
,但是使用classmethods可能比记住要__init__
工作的关键字参数的组合要方便得多。最好避免使用
isinstance
,因为python的duck类型使得很难确定实际传入了什么类型的对象。例如:如果要获取文件名或类文件对象,则不能使用isinstance(arg, file)
,因为有许多类文件对象不是file
子类(如从urllib、StringIO或…)返回的类文件对象。通常最好让调用者通过使用不同的关键字参数明确地告诉您对象的含义。对于您给出的示例,请使用默认值:
一般来说,您有两种选择:
1)基于类型的Do
if
-elif
块:2)使用duck类型——也就是说,假设您的类的用户足够聪明,能够正确使用它。这通常是首选方案。
与Java不同,不能定义多个构造函数。但是,如果未传递默认值,则可以定义该值。
相关问题 更多 >
编程相关推荐