当前位置 : 主页 > 编程语言 > python >

#yyds干货盘点#python作用域和命名空间示例

来源:互联网 收集:自由互联 发布时间:2022-06-18
​ 下例演示了如何引用不同作用域和名称空间,以及 ​​global​​​ 和 ​​nonlocal​​​ 对变量绑定的影响: ​ def scope_test (): def do_local (): spam = "local spam" def do_nonlocal (): nonlocal sp

下例演示了如何引用不同作用域和名称空间,以及 ​​global​​​ 和 ​​nonlocal​​​ 对变量绑定的影响:

def scope_test():
def do_local():
spam = "local spam"

def do_nonlocal():
nonlocal spam
spam = "nonlocal spam"

def do_global():
global spam
spam = "global spam"

spam = "test spam"
do_local()
print("After local assignment:", spam)
do_nonlocal()
print("After nonlocal assignment:", spam)
do_global()
print("After global assignment:", spam)

scope_test()
print("In global scope:", spam)

示例代码的输出是:

注意,局部 赋值(这是默认状态)不会改变 scope_test 对 spam 的绑定。 nonlocal 赋值会改变 scope_test 对 spam 的绑定,而 global 赋值会改变模块层级的绑定。

而且,global 赋值前没有 spam 的绑定。

​Class 对象​

​类对象支持两种操作:属性引用和实例化。​

​属性引用​ 使用 Python 中所有属性引用所使用的标准语法: ​​obj.name​​。 有效的属性名称是类对象被创建时存在于类命名空间中的所有名称。 因此,如果类定义是这样的:

class MyClass:
"""A simple example class"""
i = 12345

def f(self):
return 'hello world'

那么类的 ​实例化​ 使用函数表示法。 可以把类对象视为是返回该类的一个新实例的不带参数的函数。 举例来说(假设使用上述的类):

x = MyClass()

创建类的新 ​实例​ 并将此对象分配给局部变量 ​​x​​。实例化操作(“调用”类对象)会创建一个空对象。 许多类喜欢创建带有特定初始状态的自定义实例。 为此类定义可能包含一个名为 ​​__init__()​​ 的特殊方法,就像这样:

def __init__(self):
self.data = []

当一个类定义了 ​​__init__()​​ 方法时,类的实例化操作会自动为新创建的类实例发起调用 ​​__init__()​​。 因此在这个示例中,可以通过以下语句获得一个经初始化的新实例:

x = MyClass()

当然,​​__init__()​​ 方法还可以有额外参数以实现更高灵活性。 在这种情况下,提供给类实例化运算符的参数将被传递给 ​​__init__()​​。 例如

>>> class Complex:
... def __init__(self, realpart, imagpart):
... self.r = realpart
... self.i = imagpart
...
>>> x = Complex(3.0, -4.5)
>>> x.r, x.i
(3.0, -4.5)

​​MyClass.i​​ 和 ​​MyClass.f​​ 就是有效的属性引用,将分别返回一个整数和一个函数对象。 类属性也可以被赋值,因此可以通过赋值来更改 ​​MyClass.i​​ 的值。 ​​__doc__​​ 也是一个有效的属性,将返回所属类的文档字符串: ​​"A simple example class"​​。

网友评论