【问题标题】:Python classes: optional argumentPython 类:可选参数
【发布时间】:2018-11-16 23:08:35
【问题描述】:

我希望用户能够通过传递参数来启动一个类,如果他没有传递它,那么它应该由类自动创建。这通常在 Python 中是如何完成的?示例:

class MyClass(object):

    def __init__(self, argument):

        self.argm = argument
        # logic here: if user does not pass argument
        # run some function or do something


    def create_argm(self):

        self.argm = 'some_value'



object_example = MyClass()
print(object_example.argm) # will print 'some_value'

object_example = MyClass('some_other_value')
print(object_example) # will print 'some_other_value'

编辑:self.argm 将是 python-docx Object,所以我无法做到 def __init__(self, argument = Document() 还是我?

【问题讨论】:

  • def __init__(self, argument='some_value'):
  • 既然您已经知道如何创建默认参数,这应该可以回答您的问题:Python optional parameters
  • @Aran-Fey thx 链接,我将使用 argument=None 进行初始化并检查它在 init 中的值。谢谢!

标签: python class optional-arguments


【解决方案1】:

这通常通过分配给关键字参数的默认值来完成:

class MyClass(object):

    def __init__(self, argument='default value'):
        self.argm = argument

如果你希望这个默认值是一个可变对象,你必须特别注意;这可能会导致不需要的行为,因为该对象只会被创建一次,然后会发生变异。

【讨论】:

  • 它是一个可变对象,一个python-docx 对象。我想我知道你不想要的行为意味着什么,但我不确定。无论如何谢谢你的答案!
  • 我添加了一个简短的解释 - 如果你搜索堆栈溢出,你会找到长答案。
【解决方案2】:

如果你不能在函数定义中创建值,你可以使用一个什么都没有表示的值,幸运的是python有None所以你可以这样做:

class MyClass(object):
    def __init__(self, argument=None):
        if argument is None:
            self.argm = self.create_argm()
        else:
            self.argm = argument

    def create_argm(self):
        return 'some_value'

如果 None 不适合,因为您希望它成为 argument 的有效值,而不假设它被遗漏,您始终可以创建一个虚拟值:

class MyNone:
    pass

class MyClass(object):
    def __init__(self, argument=MyNone):
        if argument is MyNone:
            self.argm = self.create_argm()
        else:
            self.argm = argument

    def create_argm(self):
        return 'some_value'

【讨论】:

  • 创建像MyNone这样的对象的常用模式是sentinel = object();创建一个类有点矫枉过正。
  • 我们不能用简单的or 替换if else(在第一种情况下)。即self.argm = argument or self.create_argm()。可能是我错了吗?
  • @abdul_niyas_pm 这取决于,您知道您收到的值将始终评估为True吗?如果是,那么你可以,但一般最好不要冒险,这种代码在很多内置函数和包中,原因是它是可靠的
猜你喜欢
  • 1970-01-01
  • 2010-12-07
  • 2012-05-02
  • 1970-01-01
  • 2020-02-07
  • 2020-08-06
  • 2019-07-12
  • 2017-09-02
  • 1970-01-01
相关资源
最近更新 更多