本文目录:
1.元类,type的使用:
2.python是动态语言,__slots__的作用
3.生成器的特点,yield是什么
4.迭代器的特点
5.闭包是什么
6.装饰器是什么
7.作用域,LEGB 规则
8.深拷贝、浅拷贝
9.进制、位运算,原码,补码,反码
10.私有化,属性property
1.元类,type的使用
元类就是用来创建类的“东西”。type就是元类。
元类本身而言,它们其实是很简单的:
拦截类的创建
修改类
返回修改之后的类
2.python是动态语言,__slots__的作用
动态语言:可以在运行的过程中,修改代码
静态语言:编译时已经确定好代码,运行过程中不能修改
Python属于动态语言
Python允许在定义class的时候,定义一个特殊的__slots__变量,来限制该class实例能添加的属性:
__slots__ = ("name", "age") 注意,__slots__定义的属性仅对当前类实例起作用,对继承的子类是不起作用的
3.生成器的特点,yield是什么
在Python中,这种一边循环一边计算的机制,称为生成器:generator。
生成器的特点:
1.节约内存
2.迭代到下一次的调用时,所使用的参数都是第一次所保留下的,即是说,在整个所有函数调用的参数都是第一次所调用时保留的,而不是新创建的
4.迭代器的特点
迭代是访问集合元素的一种方式。迭代器是一个可以记住遍历的位置的对象。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。
以直接作用于 for 循环的数据类型有以下几种:
一类是集合数据类型,如 list 、 tuple 、 dict 、 set 、 str 等;
一类是 generator ,包括生成器和带 yield 的generator function。
这些可以直接作用于 for 循环的对象统称为可迭代对象: Iterable 。
5.闭包是什么
def line_conf(a, b):
def line(x):
return a*x + b
return line
line1 = line_conf(1, 1)
line2 = line_conf(4, 5)
print(line1(5))
print(line2(5))
内部函数对外部函数作用域里变量的引用(非全局变量),则称内部函数为闭包。
这个例子中,函数line与变量a,b构成闭包。在创建闭包的时候,我们通过line_conf的参数a,b说明了这两个变量的取值,这样,我们就确定了函数的最终形式(y = x + 1和y = 4x + 5)。我们只需要变换参数a,b,就可以获得不同的直线表达函数。由此,我们可以看到,闭包也具有提高代码可复用性的作用。
6.装饰器
#定义函数:完成包裹数据
def makeBold(fn):
def wrapped():
return "" + fn() + ""
return wrapped
#定义函数:完成包裹数据
def makeItalic(fn):
def wrapped():
return "" + fn() + ""
return wrapped
@makeBold
def test1():
return "hello world-1"
@makeItalic
def test2():
return "hello world-2"
@makeBold
@makeItalic
def test3():
return "hello world-3"
print(test1()))
print(test2()))
print(test3()))
运行结果:
hello world-1
hello world-2
hello world-3
@函数名,相当于先执行此函数,并将被装饰函数当参数传递给被@函数,返回值为被装饰函数,
如果有多次装饰时,将从下往上进行装饰
7.作用域,LEGB 规则
作用域:
globals、locals
全局变量和局部变量,之所有称之为局部、全局,就是因为他们的自作用的区域不同,这就是作用域
LEGB:
Python 使用 LEGB 的顺序来查找一个符号对应的对象
locals -> enclosing function -> globals -> builtins
locals,当前所在命名空间(如函数、模块),函数的参数也属于命名空间内的变量
enclosing,外部嵌套函数的命名空间(闭包中常见)
globals,全局变量,函数定义所在模块的命名空间
builtins,内建模块的命名空间。
Python 在启动的时候会自动为我们载入很多内建的函数、类,
比如 dict,list,type,print,这些都位于 __builtin__ 模块中,
可以使用 dir(__builtin__) 来查看。
这也是为什么我们在没有 import任何模块的情况下,
就能使用这么多丰富的函数和功能了
8.深拷贝、浅拷贝
1. 浅拷贝
浅拷贝是对于一个对象的顶层拷贝
通俗的理解是:拷贝了引用,并没有拷贝内容
import copy
b = copy.copy(**)
2. 深拷贝
深拷贝是对于一个对象所有层次的拷贝(递归)
相当于对整个对象进行复制
import copy
copy.deepcopy(**)
9.进制、位运算,原码,补码,反码
常用进制分为:
二进制,八进制,十进制,十六进制
位运算:
是指通过对字节的值进行位移,从而达到位运算的目的
原码补码反码:
1 的原码:0000 0000 0000 0001
-1的原码:1000 0000 0000 0001
-1的反码:1111 1111 1111 1110
-1的补码:1111 1111 1111 1111如何计算补码?
规则:
正数:原码 = 反码 = 补码
负数:反码 = 符号位不变,其他位取反
补码 = 反码+1
从补码转回原码
负数补码转换原码的规则:
原码 = 补码的符号位不变 -->数据位取反--> 尾+1
-1的补码:1111 1111 1111 1111
取反:1000 0000 0000 0000
-1的原码:1000 0000 0000 0001
10.私有化,属性property
变量的命名规则:
xx: 公有变量
_x: 单前置下划线,私有化属性或方法,from somemodule import *禁止导入,类对象和子类可以访问
__xx:双前置下划线,避免与子类中的属性命名冲突,无法在外部直接访问(名字重整所以访问不到)
__xx__:双前后下划线,用户名字空间的魔法对象或属性。例如:__init__ , __ 不要自己发明这样的名字
xx_:单后置下划线,用于避免与Python关键词的冲突
父类中属性名为__名字的,子类不继承,子类不能访问
如果在子类中向__名字赋值,那么会在子类中定义的一个与父类相同名字的属性
_名的变量、函数、类在使用from xxx import *时都不会被导入
属性property:
如果给私有属性money定义了set,get方法,
1.则可以使用
money = property(getMoney, setMoney)对set,get方法进行封装
2.还可以 使用@property对get方法进行装饰
@money.setter对set方法进行封装