本文共 1740 字,大约阅读时间需要 5 分钟。
定义一个特殊的__slots__变量,来限制该class实例能添加的属性。
class Person(object): __slots__ = ("name", "age")p = Person()p.name = "老王"p.age = 20p.score = 100 运行这段代码时,p.score = 100会抛出一个AttributeError,说明p没有score这个属性。这表明使用__slots__后,实例只能定义指定的属性,其他都无法添加。这在内存管理上非常有用,尤其是在处理大量对象时。
注意事项:
__slots__要注意,__slots__定义的属性仅对当前class实例起作用,对继承的子类是不起作用的。[]改成( )即可。G = (x * 2 for x in range(5))
输出显示G是一个generator对象。
yield: yield语句可以让函数返回一个生成器。def fib(times): n = 0 a, b = 0, 1 while n < times: yield a a, b = b, a + b n += 1
迭代与迭代器的概念:
for循环的对象都是Iterable类型;next()函数的对象都是Iterator类型;Iterable但不是Iterator,可以通过iter()函数获得一个Iterator对象。使用isinstance()判断一个对象是否是Iterable对象:
from collections import Iterableisinstance([], Iterable) # True
判断迭代器:
from collections import Iteratorisinstance((x for x in range(10)), Iterator) # True
Python使用LEGB的顺序来查找一个符号对应的对象:
locals:当前所在命名空间(如函数、模块),函数的参数也属于命名空间内的变量;enclosing:外部嵌套函数的命名空间(闭包中常见);globals:全局变量,函数定义所在模块的命名空间;builtins:内建模块的命名空间。示例:
def fun1(): a = 10 def fun2(): print(a) # a位于外部嵌套函数的命名空间
a = 1def fun(): global a a = 2 # 修改全局变量
内建模块:
dict、list、str等,存放在__builtin__模块中。dir(__builtin__)查看内建模块中的内容。is:比较两个引用是否指向了同一个对象(引用比较);==:比较两个对象是否相等。示例:
a = 5b = 5print(a is b) # Falseprint(a == b) # True
__名字的,子类不继承,子类不能访问;__名字赋值,那么会在子类中定义一个与父类相同名字的属性;_名的变量、函数、类在使用from xxx import *时都不会被导入。示例:
class Parent(object): __slot = "属性" _slot = "_属性"class Child(Parent): __slot = "子类属性" def __init__(self): super(Child, self).__setattr__("slot", "子类属性值") 通过以上知识,我们可以更好地理解和利用Python的内机制,提升代码的性能和可维护性。
转载地址:http://awlfk.baihongyu.com/