1.Python作用域和命名空间:
命名空间(namespace)是一个从名字到对象的映射。
注:不同时刻创建的命名空间拥有不同的生存期,例如包含内置名称的命名空间是在Python解释器启动时创建的,永远不会被删除;模块的全局命名空间在模块定义被读入时创建,模块命名空间也会持续到解释器退出。
作用域是一个命名空间可直接访问的Python程序的文本空间。
注:(1)最先搜索的最内部作用域包含局部名称
(2)从最近的封闭作用域开始搜索的任何封闭函数的范围包含非局部名称,也包括非全局名称
(3)倒数第二个作用域包含当前模块的全局名称
(4)最外面的范围(最后搜索)是包含内置名称的命名空间
global语句可被用来表明特定变量生存于全局作用域并且应当在其中被重新绑定。
nonlobal语句表明特定变量生存于外层作用域中并且应当在其中被重新绑定,即声明为非本地变量。
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)
After local assignment: test spam
After nonlocal assignment: nonlocal spam
After global assignment: nonlocal spam
In global scope: global spam
可以看出,第一个局部赋值不会改变scope_test对spam的绑定,变量的值,nonlobal赋值会改变scope_test 对 spam 的绑定,而 global 赋值会改变模块层级的绑定。
2.类定义:一般利用class+类名
3.类对象:类对象支持属性引用,实例化
class MyClass:
i = 12345
def f(self):
return 'hello world'
print(MyClass.i) # 12345
print(MyClass.f(345678)) # hello world
其中MyClass.i 和 MyClass.f 就是有效的属性引用,将分别返回一个整数和一个函数对象。 类属性也可以被赋值,通常可以通过定义 init() 方法为新创建的类实例
def __init__(self):
self.data = []
实例化:
class MyClass:
i=5
x=MyClass()
print(x.i) # 5
x.counter = 1
while x.counter < 10:
x.counter = x.counter * 2
print(x.counter) # 16
del x.counter
4.方法对象:一般,方法在绑定后立即被调用,但是也可以被保存起来再调用。
xf = x.f
while True:
print(xf())
5.类与实例变量:
class mm:
a = 2345
def __init__(self, b):
self.b = b
s = mm(1234)
d = mm(12345)
print(s.a) # 2345
print(d.a) # 2345
print(s.b) # 1234
print(d.b) # 12345
对于有__init__()函数存在时,调用类时都是对这个函数中的变量进行赋值的
class mm:
a=[]
def __init__(self, b):
self.b = b
def add(self,c):
self.a.append(c)
s = mm(1234)
d = mm(12345)
s.add(234567)
d.add(356789)
print(d.a) # [234567, 356789]
print(s.a) # [234567, 356789]
可以形成列表输出,且可以对这个列表进行赋值操作。
class mm:
def __init__(self, b):
self.b = b
self.a = []
def add(self,c):
self.a.append(c)
s = mm(1234)
d = mm(12345)
s.add(234567)
d.add(356789)
print(d.a) # [356789]
print(s.a) # [234567]
可以对每个列表进行单个赋值操作。
注意:可以将一个函数对象赋值给一个局部变量例如上式改为:
def add(self, b):
self.b = b
g=add
6.继承:
class DerivedClassName(BaseClassName):
Python有两个内置函数可被用于继承机制:
(1)使用 isinstance() 来检查一个实例的类型: isinstance(obj, int) 仅会在 obj.class 为 int 或某个派生自 int 的类时为 True。
(2)使用 issubclass() 来检查类的继承关系: issubclass(bool, int) 为 True,因为 bool 是 int 的子类。 但是,issubclass(float, int) 为 False,因为 float 不是 int 的子类。
多重继承:
class DerivedClassName(Base1, Base2, Base3):