首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Python中不能定义多个构造函数吗?

问在Python中不能定义多个构造函数吗?
EN

Stack Overflow用户
提问于 2010-01-29 18:38:13
回答 5查看 321.7K关注 0票数 288

可能重复: 什么是在Python中使用多个构造函数的干净的、pythonic的方法?

在Python中不能用不同的签名定义多个构造函数吗?如果没有,一般有什么方法可以绕过它呢?

例如,假设您想要定义一个类City。

我希望能够说someCity = City()或someCity = City("Berlin"),其中第一个只给出一个缺省名称值,而第二个定义它。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-01-29 18:41:42

与Java不同,您不能定义多个构造函数。但是,如果未传递默认值,则可以定义默认值。

代码语言:javascript
复制
def __init__(self, city="Berlin"):
  self.city = city
票数 365
EN

Stack Overflow用户

发布于 2010-01-29 18:57:12

如果您的签名仅在参数数量上有所不同,则使用默认参数是正确的方法。如果您希望能够传递不同类型的参数,我将尽量避免使用另一个答案中提到的isinstance-based方法,而是使用关键字参数。

如果使用just关键字参数变得不方便,可以将其与classmethods组合( bzrlib代码喜欢这种方法)。这只是一个愚蠢的例子,但我希望你明白这个想法:

代码语言:javascript
复制
class C(object):

    def __init__(self, fd):
        # Assume fd is a file-like object.
        self.fd = fd

    @classmethod
    def from_filename(cls, name):
        return cls(open(name, 'rb'))

# Now you can do:
c = C(fd)
# or:
c = C.from_filename('a filename')

注意,所有这些类方法仍然要经过相同的__init__,但是使用类方法可能比记住__init__的关键字参数组合更方便。

最好避免使用isinstance,因为Python的鸭子类型使得很难确定到底传入了什么类型的对象。例如:如果您想使用文件名或类似文件的对象,则不能使用isinstance(arg, file),因为有许多类文件对象不是file子类(例如从urllib或StringIO返回的对象,或.)。通过使用不同的关键字参数,让调用方明确地告诉您对象的含义通常是一个更好的主意。

票数 305
EN

Stack Overflow用户

发布于 2010-01-29 18:40:58

对于您提供的示例,请使用默认值:

代码语言:javascript
复制
class City:
    def __init__(self, name="Default City Name"):
        ...
    ...

一般来说,您有两种选择:

  1. 根据类型执行if-elif块: def __init__(self,name):if isinstance(name,str):# todo elif isinstance(name,City):# todo # todo #todo
  2. 使用鸭子类型--也就是说,假设您的类的用户足够聪明,可以正确使用它。这通常是首选选项。
票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2164258

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档