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

我可以使用class属性作为实例方法的默认值吗?

欧阳俊明
2023-03-14
问题内容

我想将类属性用作类__init__方法的参数之一的默认值。NameError但是,此构造引发了一个异常,而我不明白为什么:

class MyClass():
    __DefaultName = 'DefaultName'
    def __init__(self, name = MyClass.__DefaultName):
        self.name = name

为什么会失败,并且有办法做到这一点?


问题答案:

这是因为,根据文档:

执行功能定义时将评估默认参数值。 这意味着在定义函数时,表达式将被计算一次

__init__()定义了时,的定义MyClass是不完整的,因为它仍在解析中,因此您还不能参考MyClass.__DefaultName。解决该问题的一种方法是将一个特殊的唯一值传递给__init__(),例如None

def __init__(self, name=None):
    if name is None:
        name = MyClass.__DefaultName
    # ...


 类似资料:
  • 问题内容: def save_file(self, outputfilename = self.image_filename): self.file.read(outputfilename) .... 在第一行中给出。似乎Python不接受它。我该如何重写代码,以免引发异常? 问题答案: 使用默认值并检测到该值。

  • 问题内容: 我想做这样的事情: 但是,这会导致错误,是否可以在mysql中为默认值调用函数? 谢谢。 问题答案: 不,你不能。 但是,您可以轻松创建触发器来执行此操作,例如:

  • 问题内容: 这个问题已经在这里有了答案 : 使用self。*作为方法的默认值[重复] (4个答案) 4年前关闭。 在分配函数时,Python表示未解决的参考。这是为什么? 问题答案: 定义方法时, 将解析方法(和函数)的默认参数值。当这些值可变时,这会导致常见的Python陷阱:“最低惊讶”和可变默认参数 在您的情况下,定义方法时不可用(并且如果作用域中有这样的名称,因为您实际上尚未完成对类的定义

  • 问题内容: 我正在使用JavaScriptSerializer序列化一些实体对象。 问题是,许多公共属性都包含空值或默认值。有什么方法可以使JavaScriptSerializer排除具有null或默认值的属性? 我希望得到的JSON不再那么冗长。 问题答案: 对我有用的解决方案: 序列化的类和属性将如下装饰: IsRequired是关键项。 实际的序列化可以使用DataContractJsonS

  • 问题内容: 我将 .properties 文件中的属性注入到 @Value 注释的字段中。但是,此属性提供敏感的凭据,因此我将它们从存储库中删除。我仍然希望在某些情况下想要运行项目并且没有带有默认值将设置为字段的凭据的.properties文件。 问题 即使我将默认值设置为字段本身,当.properties文件不存在时,也会出现异常: 这是带注释的字段: 我希望在这种情况下只设置普通的字符串“ s

  • 本文向大家介绍C#属性的默认值,包括了C#属性的默认值的使用技巧和注意事项,需要的朋友参考一下 示例 可以使用初始化程序(C#6)设置默认值 如果它是只读的,则可以返回如下值: