相关疑难解决方法(0)

在函数内创建一个类并访问在包含函数范围内定义的函数

编辑:

请参阅本问题底部的完整答案.

tl;博士回答:Python有静态嵌套的范围.的静态 方面可以与隐变量声明相互作用,产生非显而易见的结果.

(这可能特别令人惊讶,因为语言通常具有动态性质).

我认为我对Python的范围规则有一个很好的处理,但是这个问题让我彻底陷入困境,而且我的google-fu让我失望了(不是我很惊讶 - 看看问题标题;)

我将从一些可以按预期工作的示例开始,但是可以自由地跳到示例4的多汁部分.

例1.

>>> x = 3
>>> class MyClass(object):
...     x = x
... 
>>> MyClass.x
3
Run Code Online (Sandbox Code Playgroud)

足够简单:在类定义期间,我们能够访问外部(在本例中为全局)范围中定义的变量.

例2.

>>> def mymethod(self):
...     return self.x
... 
>>> x = 3
>>> class MyClass(object):
...     x = x
...     mymethod = mymethod
...
>>> MyClass().mymethod()
3
Run Code Online (Sandbox Code Playgroud)

再次(忽略了为什么人们可能想要这样做),这里没有任何意外:我们可以访问外部范围中的函数.

注意:正如Frédéric在下面指出的那样,这个功能似乎不起作用.请参见示例5(及更高版本).

例3.

>>> def myfunc():
...     x = 3
...     class MyClass(object):
...         x = x
...     return MyClass
... …
Run Code Online (Sandbox Code Playgroud)

python scope namespaces

62
推荐指数
2
解决办法
5万
查看次数

类块中定义的名称范围不会扩展到方法的块.这是为什么?

阅读文档我遇到了以下段落:

范围定义块内名称的可见性.如果在块中定义了局部变量,则其范围包括该块.如果定义发生在功能块中,则作用域将扩展到定义块中包含的任何块,除非包含的块为名称引入了不同的绑定.类块中定义的名称范围仅限于类块; 它没有扩展到方法的代码块 - 这包括了解和生成器表达式,因为它们是使用函数作用域实现的.

我决定尝试自己从方法中访问类变量:

>>> class A():
    i = 1
    def f(self):
        print(i)            

>>> a = A()

>>> a.i
1

>>> a.f()
Traceback (most recent call last):
  File "<pyshell#7>", line 1, in <module>
    a.f()
  File "<pyshell#4>", line 4, in f
    print(i)
NameError: global name 'i' is not defined
Run Code Online (Sandbox Code Playgroud)

我知道i可以通过显式指向类名来访问该变量A.i:

>>> a = A()
>>> class A():
    i = 1
    def f(self):
        print(A.i)          
>>> a = A()
>>> a.f()
1
Run Code Online (Sandbox Code Playgroud)

问题是为什么该语言的开发人员使方法中的类变量不可见?它背后的理由是什么?

python oop scope class

10
推荐指数
2
解决办法
1926
查看次数

Python类和全局与局部变量

我有一个问题,了解以下代码片段的结果发生了什么:

my_str = "outside func"
def func():
    my_str = "inside func"
    class C():
        print(my_str)
        print((lambda:my_str)())
        my_str = "inside C"
        print(my_str)
Run Code Online (Sandbox Code Playgroud)

输出是:

outside func
inside func
inside C
Run Code Online (Sandbox Code Playgroud)

另一段代码是:

my_str = "not in class"
class C:
    my_str = "in the class"
    print([my_str for i in (1,2)])
    print(list(my_str for i in (1,2)))
Run Code Online (Sandbox Code Playgroud)

输出是:

[‘in the class’, 'in the class’]
['not in class’, 'not in class’]
Run Code Online (Sandbox Code Playgroud)

问题是:

  1. 每个print()语句中发生了什么?
  2. 任何人都可以解释为什么 print()语句从不同的命名空间中获取字符串?

编辑1:

我认为这与这个问题不同,因为我谦卑地认为那里的答案并不能解释这种变化:

my_str = "outside func"
def func():
    my_str = …
Run Code Online (Sandbox Code Playgroud)

python namespaces class global-variables

6
推荐指数
1
解决办法
511
查看次数

标签 统计

python ×3

class ×2

namespaces ×2

scope ×2

global-variables ×1

oop ×1