python知识点
封装:将有相同行为特征的事物抽取到同一个类中
继承:子类能继承父类的方法
多态:父类引用指向子类对象
##is 与 == 区别
is
用于判断 两个变量 引用对象是否为同一个
==
用于判断 引用变量的值 是否相等
>>> a = [1, 2, 3]
>>> b = [1, 2, 3]
>>> a is b
False
>>> a == b
True
##python继承的特点
- python支持多继承,当继承的不同类中有相同的方法时,后面的会覆盖前面的方法,此时调用方法时可能导致未知错误,对于继承多个类的相同方法,子类最好复写父类的方法。 ------MRO —— 方法搜索顺序,python中提为类提供了一个内置属性,用于搜索方法的加载顺序。
- 继承有传递性,父类的方法在子孙类中都能用,类中的私有属性和私有方法不能继承,在子孙类中不能直接访问
- object是所有类的基类,python3默认继承object类,称为 新式类,python2中默认没有继承object类,称为旧式类,新式类提供了一些内置属性和方法,可以用dir()查看
__方法名__
是python提供的内置方法__方法名
是类中的私有方法,__属性名
是类中的私有属性。类中重要的几个内置方法
| 序号 | 方法名 | 作用 |
|----------|:-------------?:------?
| 1 |__new__
| 创建对象时,会被自动调用 |
| 2 |__init__
| 对象被初始化时,会被 自动 调用 |
| 3 |__del__
| 对象被从内存中销毁前,会被 自动 调用 |
| 4 |__str__
| 返回对象的描述信息,print 函数输出使用 |- python没有完全的私有属性和方法,私有属性和方法可以通过
_类名__名称
的方式访问
##实例方法、类方法、静态方法
实例方法定义在类的内部,第一个参数为self,那个对象调用该方法self就是那个对象的引用。
类方法需要用@classmethod
注解标识,类方法可以通过类名.方法名
直接访问,也可以通过对象名.方法名
访问,(不推荐这样访问)
@classmethod
def 类方法名(cls):
pass
静态方法,如果需要在类中封装一个方法,这个方法既不需要访问实例属性或者调用实例方法也不需要访问类属性或者调用类方法这个时候,可以把这个方法封装成一个静态方法
@staticmethod
def 静态方法名():
pass
class Game(object):
# 游戏最高分,类属性
top_score = 0
@staticmethod
def show_help():
print("帮助信息:让僵尸走进房间")
@classmethod
def show_top_score(cls):
print("游戏最高分是 %d" % cls.top_score)
def __init__(self, player_name):
self.player_name = player_name
def start_game(self):
print("[%s] 开始游戏..." % self.player_name)
# 使用类名.修改历史最高分
Game.top_score = 999
# 1. 查看游戏帮助
Game.show_help()
# 2. 查看游戏最高分
Game.show_top_score()
# 3. 创建游戏对象,开始游戏
game = Game("小明")
game.start_game()
# 4. 游戏结束,查看游戏最高分
Game.show_top_score()
##python中的单例
class MusicPlayer(object):
# 记录第一个被创建对象的引用
instance = None
# 记录是否执行过初始化动作
init_flag = False
def __new__(cls, *args, **kwargs):
# 1. 判断类属性是否是空对象
if cls.instance is None:
# 2. 调用父类的方法,为第一个对象分配空间
cls.instance = super().__new__(cls)
# 3. 返回类属性保存的对象引用
return cls.instance
def __init__(self):
if not MusicPlayer.init_flag:
print("初始化音乐播放器")
MusicPlayer.init_flag = True
# 创建多个对象
player1 = MusicPlayer()
print(player1)
player2 = MusicPlayer()
print(player2)
##python中的异常
任何代码都会产生异常,产生异常后需要对异常进行捕获,然后给用户一个友好的反馈,python异常捕获流程
try:
# 尝试执行的代码
pass
except 错误类型1:
# 针对错误类型1,对应的代码处理
pass
except 错误类型2:
# 针对错误类型2,对应的代码处理
pass
except (错误类型3, 错误类型4):
# 针对错误类型3 和 4,对应的代码处理
pass
except Exception as result:
# 打印错误信息
print(result)
else:
# 没有异常才会执行的代码
pass
finally:
# 无论是否有异常,都会执行的代码
print("无论是否有异常,都会执行的代码")
else
里面的代码块只要没有发生异常就会执行
finally
里面的代码不管是否有异常都会执行
自定义异常:有些时候根据业务需求,我们需要对数据进行校验,校验的规则是我们自己定义的,当用户输入的数据不符合我们的规则的时候我们要主动抛出自定义异常,例如:
- 定义 input_password 函数,提示用户输入密码
- 如果用户输入长度 < 8,抛出异常
- 如果用户输入长度 >=8,返回输入的密码
def input_password():
# 1. 提示用户输入密码
pwd = input("请输入密码:")
# 2. 判断密码长度,如果长度 >= 8,返回用户输入的密码
if len(pwd) >= 8:
return pwd
# 3. 密码长度不够,需要抛出异常
# 1> 创建异常对象 - 使用异常的错误信息字符串作为参数
ex = Exception("密码长度不够")
# 2> 抛出异常对象
raise ex
try:
user_pwd = input_password()
print(user_pwd)
except Exception as result:
print("发现错误:%s" % result)
##模块导入
import
导入这种导入会导入模块中的全部功能
from ... import ...
从某个模块中导入某些功能
模块导入是时候如果两个模块中有相同的函数,后面导入的模块将覆盖前面导入的模块,这时候可以as
为模块增加一个别名防止冲突,模块导入是时候不能用import *
##包
可以将多个模块组合的功能放到一个包中,import 包名
可以导入包中所有模块,包中有一个特殊的文件__init__.py
文件,区分是一个文件夹还是一个python包,要在外界使用包的模块,需要在包的__init__.py
文件中指定外部能访问的模块名
发布模块
- 创建setup.py文件
from distutils.core import setup
setup(name="hm_message", # 包名
version="1.0", # 版本
description="itheima's 发送和接收消息模块", # 描述信息
long_description="完整的发送和接收消息模块", # 完整描述信息
author="itheima", # 作者
author_email="itheima@itheima.com", # 作者邮箱
url="www.itheima.com", # 主页
# 需要打包的模块
py_modules=["hm_message.send_message",
"hm_message.receive_message"])
- 构建模块
python3 setup.py build
- 生成发布压缩包
python3 setup.py sdist
- 安装打包的模块
tar -zxvf hm_message-1.0.tar.gz
sudo python3 setup.py install
##文件的访问方式
|访问方式|说明|
|----------|:-------------|
|r|以只读方式打开文件。文件的指针将会放在文件的开头,这是默认模式。如果文件不存在,抛出异常|
|w|以只写方式打开文件。如果文件存在会被覆盖。如果文件不存在,创建新文件|
|a|以追加方式打开文件。如果该文件已存在,文件指针将会放在文件的结尾。如果文件不存在,创建新文件进行写入|
|r+|以读写方式打开文件。文件的指针将会放在文件的开头。如果文件不存在,抛出异常|
|w+|以读写方式打开文件。如果文件存在会被覆盖。如果文件不存在,创建新文件|
|a+|以读写方式打开文件。如果该文件已存在,文件指针将会放在文件的结尾。如果文件不存在,创建新文件进行写入|