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

如何在课程范围内使用课程名称?

金令
2023-03-14
问题内容

我对Python不太熟悉。所以我在编码时遇到了一些问题。

功能块中* 使用 功能名称 是很正常的,例如: *

def factorial(n):
    if n == 1:
        return n
    else:
        return n * factorial(n-1)

但是,当我尝试在 类块中* 使用 类名 时,出现了问题: *

class Foo(object):
    a = Foo
NameError: name 'Foo' is not defined

尽管下面的代码可以:

class Foo(object):
    def __init__(self):
        a = Foo

然后,我使用print globals()statement调试这两个代码。我发现 类块class Foo的全局变量dict不包含,而__init__ 功能块 中的全局变量dict 包含了它。

因此,似乎类名称绑定是在执行 类块 之后,在执行 功能块之前

但是我不喜欢编码基础领域的猜测。有人可以对此提供更好的解释或官方材料吗?


问题答案:

您的解释是正确的:

类名绑定是在类块执行之后,功能块执行之前。

这只是说立即执行一个类块,而直到调用该函数才执行一个功能块。请注意,在这两种情况下,直到创建对象(类或函数)后,名称才被绑定。只是函数体是 创建函数
之后 执行的,而类体是在创建类 之前 执行的(作为类创建过程的一部分)。

这是因为类和函数是不同的野兽:当您定义一个类时,您正在“立即”定义该类应包含的内容(即,其方法和属性);当您定义函数时,您正在定义稍后要发生的事情(当您调用它时)。

该文档明确指出:

类定义是可执行语句。它首先评估继承列表(如果存在)。[…]然后执行该类的套件[…]

类主体在执行class语句时执行。这与某些其他语言不同,在其他语言中,类定义是“声明”,不会像其他语句那样按源文件的线性顺序执行。(我相信很明显为什么在定义函数时
执行函数主体—如果立即运行代码,将代码放入函数中没有多大意义。)



 类似资料:
  • 我怎样才能防止学生注册课程有必修课必须完成它 代码:

  • 问题内容: 当然会抛出NPE。 如果实例为空,我应该使用什么语法来获取T类?可能吗? 问题答案: 由于类型擦除,这是不可能的。 有以下解决方法:

  • 您已经看到Pascal Objects展示了面向对象范式的一些特征。 它们实现了封装,数据隐藏和继承,但它们也有局限性。 例如,Pascal Objects不参与多态。 因此,类被广泛用于在程序中实现适当的面向对象行为,尤其是基于GUI的软件。 Class的定义方式与Object几乎相同,但它是指向Object而不是Object本身的指针。 从技术上讲,这意味着Class在程序的堆上分配,而Obj

  • 问题内容: 我该如何与正在测试的班级中的Mockito其他班级进行模拟? 例如: MyClass.java 任何东西PerformerClass.java 并测试: 我是否可以欺骗以排除不必要的逻辑?我可以重写方法来简单地返回还是? 为什么指定Mockito,因为在Robolectric进行Android测试时需要它。 问题答案: 您可以重构,以便它使用依赖注入。不用让它创建实例,您可以将类的实例

  • 问题内容: 在JavaScript中有很多方法可以完成相同的操作。但是,我已经掌握了一些方式,但坦率地说,有些方式我不理解。有人可以帮我澄清一些事情吗?(我首先在PHP中学习了OOP。) 所以可以这样制作一个类: 到目前为止,这一切正确吗? 然后有人喜欢使用自执行匿名函数方法来创建名称空间。这样做的目的是什么,当您在上面做同样的事情时,提供了一个命名空间? 最后,您有一个我不理解的对象文字符号。

  • 问题:我们有超过8000个课程要创建,并且希望使用批处理系统,或者至少异步地创建它们。我们通过别名在create调用中传递我们的内部唯一课程ID。但是,在回调方法中,该值不会传递回来。这意味着我们无法将google的唯一ID链接到我们的ID上,也无法知道是否出现了问题,哪些课程不是创建的。 示例:我想用以下ID创建5个课程:1234 1235 1236 1237 1238 所以我创建了一个批处理请