gpt4 book ai didi

python - 没有 self 访问类属性的困惑 - python

转载 作者:行者123 更新时间:2023-12-03 16:38:38 25 4
gpt4 key购买 nike

我知道我们可以使用 self 访问类属性或 class姓名。

但我有点困惑为什么以下也有效

class Crazy(object):
VERSION = 1
def __init__(self, version=VERSION):
print version

但这并不
class Crazy(object):
VERSION = 1
def __init__(self):
print VERSION

最佳答案

类定义,即 class ...: 中的 block , 像任何常规 Python 代码块一样被评估。就在 class 的末尾 block ,在该 block 内定义的每个本地名称都成为类的一部分'__dict__ . class语法或多或少只是语法糖:

Crazy = type('Crazy', (object,), {'VERSION': 1, ...})
https://docs.python.org/3/library/functions.html#type .
鉴于此,您希望这会起作用,对吧?
VERSION = 1

def foo(bar=VERSION):
print(bar)
(有关其行为的更多解释,请参见 this。)
内部 class阻止它的工作方式完全相同,唯一的特殊行为是您不是创建全局名称,而是创建将成为类的名称 __dict__ .
文档中的相关段落在这里:

The class’s suite is then executed in a new execution frame (see Naming and binding), using a newly created local namespace and the original global namespace. (Usually, the suite contains mostly function definitions.) When the class’s suite finishes execution, its execution frame is discarded but its local namespace is saved. A class object is then created using the inheritance list for the base classes and the saved local namespace for the attribute dictionary. The class name is bound to this class object in the original local namespace.

https://docs.python.org/3/reference/compound_stmts.html#class-definitions


但是,在定义类之后,该隐式命名空间不再存在,因此这不起作用:
def __init__(self):
print(VERSION)
范围规则遵循常规查找链:
  • 它是同一函数内的局部变量吗?
  • 它是周围函数中的非局部变量吗?
  • 它是一个全局变量吗?

  • 这些都不是真的,因为 VERSION只是 Crazy 的一个属性此时,so 只能作为 Crazy.VERSION 访问或 self.VERSION , 后者实际上也不存在并回退到自己的查找链上并遍历到 Crazy.VERSION .

    关于python - 没有 self 访问类属性的困惑 - python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56868964/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com