python中如何对一个属性或方法进行封装_Python基础四

本文目录:

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方法进行封装

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值