proverty详解
proverty(fget,fset,fdel,“说明文档”)
其中属性有三种操作,赋值读取删除,然后对于操作我们有很多需求添加功能,就需要用proverty
第一个fget是模拟读取操作,fset是模拟其他各种操作,fdel模拟删除操作,关键功能在于fset,fset即实现各种其他操作的函数
抽象类
抽象方法:
没有功能,只是说明应该具有的功能,规范子类的行为和接口
抽象类:
使用借助abc,包含抽象方法的类
实现:
import abc
class Human(metaclass = abc.ABCMeta):
定义抽象方法
@abc.abstractmethod
定义类抽象方法
@abc.abstractclassmethod
定义静态抽象方法
@abc.abstractstatisticmethod
1.抽象类不允许实例化
2.抽象类中可以有方法有属性
3.抽象类中可以包含抽象方法也可以包含具体方法
4.必须继承才能使用,且继承的子类必须实现所有继承类的抽象方法
5.假定子类没有实现所有继承的抽象方法,则子类也不能实例化
6.抽象类的主要作用是设定类的标准,以便于开发时具有统一的规范
自定义类
类其实是各种属性和方法的组合:函数名可以当变量使用定义
用type创建一个类
MethodType实现
可以定义类和函数然后自己通过类直接赋值
利用元类实现——MetaClass元
类写法固定,必须继承自type,一般以MetaClass结尾
class xxxxMetaClass(type):
def new(cls,name,bases,attrs):
自己的代码
return type.new(cls,name,bases,attrs)
元类定义完就可以使用
class Stu(object,metaclass=xxxxMetaClass):
pass
关于包的使用
1.模块(复用方便,扩展方便):包含python代码的文件,后缀名是py就可以
2.程序太大需要拆分分工合作
3.模块可以增加代码重复利用的方式
4.当作命名空间使用,避免命名冲突
定义模块:
模块就是一个普通文件,直接书写即可
根据模块规范,最好在模块中写如下内容:
- 函数(单一功能)
- 类(相似功能或者类似业务模块)
- 测试代码:
使用方法:
1.直接导入:
import module_name
module_name.function_name
module_name.class_name
2.借助于importlib可以实现导入以数字开头的模块名称
a = importlib.import_module(“01”)
3.import 模块 as 别名:导入同时给模块前一个别名
4.from module_name import func_name,class_name:有选择性的导入,就不必用module_name.function_name,就跟刚定义过一样,直接使用
5.from module_name import *:从模块中把所有的都导入出来,不需要加前缀
6.if name == “main”:作为模块的入口就可以避免调用时出现不必要的东西
模块的搜索路径
1.什么是模块的搜索路径:加载模块的时候系统会在哪些地方寻找此模块
2.系统默认搜索路径:
import sys
sys.path
3.添加搜索路径
用列表添加方法:
sys.path.append(dir)魔魁啊加载顺序
4.模块加载顺序
- 搜索内存
- 搜索python内置
- 搜索sys.path
5.包管理
包是一种组织管理的方式,包内存放的是模块
/-----包
/-----/-------init.py
/-----/-------模块一
/-----/-------模块二
/-----/-------子包文件夹
/-----/-------/-----init.py
/-----/-------/-----子包模块1
/-----/-------/-----子包模块2
包的导入问题
导入__init__.py中的内容
1.import package_name
使用方式:
package__name.func_name
package_name.class_name.func_name
2.import package_name as 别名 和模块一样
3.from package import *
导入当前包 init.py文件中所有的函数和类
导入包中模块的内容
1.import package.module
使用方法:
a = package.module.dunc
a.func
2.import package.mudle as p
3.from package import module
从包中直接导入而且不执行 init.py的内容
from package.module import *
导入当前包 package.module文件中所有的函数和类
在开发环境中经常会所以使用其他模块,可以在当前包中直接导入其他模块中的内容
import 完整的包或者模块的路径
all__的用法:
from package import *的时候,在__init.py中如果添加了__all__为其设定了值,那么就按照__all__指定的子包或者模块进行加载,不会执行__init__中的内容,而对于一般情况下,是要执行__init__的内容的
命名空间:用于区分不同位置不同功能但相同名称的函数或者变量的一个特定前缀,防止命名冲突