【问题标题】:'name not defined' when setting a class to a variable将类设置为变量时出现“未定义名称”
【发布时间】:2021-08-25 21:40:27
【问题描述】:

抱歉这个愚蠢的问题,我似乎无法在任何地方找到答案。

我正在尝试将我的类转换为变量,但它给了我一个错误

NameError: name 'period' is not defined
class Stuff():
    
    def __init__(self, period = 1, division = 1): 
    
        print(str(period), str(division))
            
stuff = Stuff(period, division)

但我不明白为什么它没有被定义,因为我特意将它定义为“1”,只是为了确定。

如果我不定义参数,我会得到同样的错误

class Stuff():
    
    def __init__(self, period, division): 
    
        print(str(period), str(division))
            
stuff = Stuff()

我不想在调用参数之前定义参数,因为在此之前参数不会有值。 我也不明白为什么需要定义它,因为函数启动参数不是文字。

【问题讨论】:

  • 如果你想用默认参数调用Stuff,你需要stuff = Stuff()
  • 如果我在没有定义参数的情况下这样做,我会得到同样的错误。但是,在我调用它们并填充它们之前,参数不会有值,就像我使用普通函数一样。所以我无法定义它们。
  • 如果您希望能够在没有显式参数的情况下实例化类,您想要def __init__() 行中的默认值。如果您想使用这些默认值,您不想调用Stuff() 中的值。
  • 要么您想调用 Stuff() 并使用参数的默认值,在这种情况下,方法必须具有其参数的默认值;或者您想在实例化类时为这些参数提供值,在这种情况下,您必须实际提供值

标签: python python-3.x class default-arguments


【解决方案1】:

一些事情。

首先,您没有将您的类“转换”为变量。您正在实例化类型并将该实例分配给一个变量,该变量包含对对象的引用。

转向手头的问题。正如 cmets 建议和扩展的那样,您从根本上误解了默认参数和实例化。

在您的第一个示例中,您有 perioddivision 参数,它们都在构造函数 (__init__) 的范围内定义。在构造函数中使用它们是有效的,因为它们存在在那个范围内。

在下面,您尝试通过传递名为perioddivision 的变量来实例化Stuff,而这不存在。它们不存在,因为您是构造函数的outside of the scope

你需要创建这些

class Stuff():
    
    def __init__(self, period = 1, division = 1): 
        print(str(period), str(division))


period = 1
division = 1

stuff = Stuff(period, division)

定义的变量与Stuff类的参数无关,只是实例化这个对象时传入的。

在您的第二个示例中,您已从实例化中删除了这些不存在的变量,这是正确的,但您还删除了 Stuff 类中参数的默认分配,这是错误的。这是错误的,因为现在您正在实例化一个其构造函数具有必需参数的对象,没有它它不知道如何处理这些参数。

错误反映了这一强制性要求

TypeError: __init__() missing 2 required positional arguments: 'period' and 'division'

对于第二个例子,正确的语法应该是

class Stuff():
    
    def __init__(self, period = 1, division = 1):
        print(str(period), str(division))


stuff = Stuff()

【讨论】:

    猜你喜欢
    • 2021-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-14
    • 2013-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多