当前位置: 首页 > 面试题库 >

在Python中具有多个构造函数的一种干净的pythonic方法是什么?

雍河
2023-03-14
问题内容

我找不到确切的答案。据我所知,__init__Python类中不能有多个功能。那么我该如何解决这个问题呢?

假设我有一个Cheese用number_of_holes属性调用的类。我如何有两种创建奶酪对象的方式…

  1. 有很多这样的漏洞: parmesan = Cheese(num_holes = 15)
  2. 还有一个不带参数而只是随机化number_of_holes属性的参数:gouda = Cheese()

我只能想到一种执行此操作的方法,但这似乎很笨拙:

class Cheese():
    def __init__(self, num_holes = 0):
        if (num_holes == 0):
            # randomize number_of_holes
        else:
            number_of_holes = num_holes

你说什么?还有另一种方法吗?


问题答案:

None对于“魔术”值,实际上要好得多:

class Cheese():
    def __init__(self, num_holes = None):
        if num_holes is None:
            ...

现在,如果你想完全自由地添加更多参数:

class Cheese():
    def __init__(self, *args, **kwargs):
        #args -- tuple of anonymous arguments
        #kwargs -- dictionary of named arguments
        self.num_holes = kwargs.get('num_holes',random_holes())

为了更好地解释*argsand 的概念**kwargs(你实际上可以更改这些名称):

def f(*args, **kwargs):
   print 'args: ', args, ' kwargs: ', kwargs

>>> f('a')
args:  ('a',)  kwargs:  {}
>>> f(ar='a')
args:  ()  kwargs:  {'ar': 'a'}
>>> f(1,2,param=3)
args:  (1, 2)  kwargs:  {'param': 3}


 类似资料:
  • 问题内容: 我在一个Activity中有一个IntentService,当我尝试调用该服务时,它将引发此错误,我发现这很奇怪,因为如果我声明了空的构造函数。 错误: AndroidManifest.xml 活动: 问题答案: 你是一个内部阶级。如果要将其保留在内部,请将其更改为static: 您可能需要阅读不同类型的嵌套类。google的第一个链接:http : //docs.oracle.com

  • 主模块(App) 数据模块(具有网络和数据库依赖性的Android模块) 域模块(纯Kotlin模块) 为了引入分页,我不得不将类视为域类。(IMO并不是一个可怕的想法,因为最终是一个列表,并且数据源是抽象的) 因此,在域层中,我可以有一个类似的repository: Im aware具有和方法,但工厂驻留在数据层中。我的Viewmodel使用来自模型层的数据,在本例中,模型层是,据我所知,分页列

  • 在我的应用程序中,有几个组件将生成各种不同类型的特定于应用程序的事件。这些事件将发布到代理并传递给N个客户端。其中一些客户端是我的服务器端应用程序中的其他Java类,但主要消费者是我的基于javascript的WebUI。 到目前为止,我目前的方法是定义一个抽象事件基类来封装一些公共字段,然后为每个事件实现一个特定的事件类。 这一直工作正常,只是现在我需要在javascript和java端维护事件

  • 我在学习Kotlin的过程中遇到了一个我想不通的问题。我想在Kotlin中扩展Java类,并且能够在不同的情况下使用它的三个构造函数中的任何一个(基于我想抛出异常时所拥有的信息)。在java中,我的类将如下所示: 有人能建议我在Kotlin如何正确地做到这一点吗?

  • 问题内容: 我正在学习RxJava,并且在很多地方看到可以通过这种方式处理错误: 我是唯一认为这确实是错误代码的人吗?我该如何做得更好?我虽然使用了“访问”我的基本异常的每种具体类型的模式,但是方法始终需要一个;。您不能使用自己的基本异常。 问题答案: 错误处理程序: 您可以这样使用: