# 指定文本编码格式
## 指定编码格式的注释
# *_* coding:utf8 *_*
## 指定字符串使用的编码格式
hello_str=u“hello世界”# 使用u指定字符串用utf8编码进行解析
# 类
## 空对象None关键字
### 身份运算符
is #可用于比较两个变量的内存地址是否相等,判断数据是否为None时也推荐使用is
is not
## 大驼峰命名法
首字母大写,单词与单词之间不使用下划线
## 内置函数
dir() :传入变量名,可查看该变量对应的方法,包括内置方法(__fuctionName__)
## 定义类并创建对象
class Cat: #定义类,首字母大写
def eat(self): # 创建方法
# self说明:哪一个对象调用该方法,self就是这个对象的引用,可以通过self.的方式获取这个对象的属性
print("小猫吃鱼")
def drink(self):
print("小猫喝水")
tom = Cat() # 创建对象
tom_cat = Cat() # 使用同一个类创建的不同对象,对象本身也不相同,在内存中都分配有不同的id
tom.name=“大猫” # 直接给tom对象增加属性,不推荐使用
tom.eat() # 调用对象中的方法
tom.drink()
## __init__(self) 初始化方法
class Cat:
def __init__(self,new_name):
print("初始化方法")
# self.name = "Tom" # 初始化时可以给类创建属性
self.name = new_name # 以参数的形式传递属性值
tom = Cat() # 创建对象时会自动调用初始化方法,执行__init__方法
tom2 = Cat(“tom2”)
print(tom.name)
print(tom2.name)
## __del__(self) 销毁执行方法
class Cat:
def __del__(self):
print("最后执行del")
tom = Cat() # 创建对象
print("*" * 50) #此处打印在“最后执行del”之前,因为__del__在所有执行完后回收内存时执行
## __str__(self) 更改
class Cat:
def __str__(self):
print("最后执行del")
return "这是打印对象的返回值"
tom = Cat() # 创建对象
print(tom) # 此处打印__str__的返回值,而不是对象信息
## __new__方法,为对象分配空间
class Tool(object): # 传递基类object到当前类中
def __new__(cls, *args, **kwargs): # 重写子类的__new__方法
print("分配空间")
instance = super().__new__(cls) # 调用父类中的__new__方法,返回当前类对象,否则重写__new__后当前类无法执行__init__方法
print(instance)
# return instance
def __init__(self):
print("初始化")
tool1 = Tool()
### 使用__new__进行单例设计,让类创建的实例,使用相同的内存引用
class Tool(object):
instance = None # 定义一个空的内置属性
def __new__(cls, *args, **kwargs):
if cls.instance is None:
cls.instance = super().__new__(cls) #第一次为空时,保存创建的应用实例
return cls.instance
tool1 = Tool()
print(tool1) #输出结果内存地址相同
tool2 = Tool()
print(tool2)
## 私有属性和方法(在属性名和方法名前增加__双下划线),父类的私有属性和方法子类无法继承
class Cat:
def __init__(self):
self.__age = 18 #定义私有属性
def get_age(self):
print("年龄%d" % self.__age) # 内部可以访问私有
self.__secret() # 内部可以调用私有方法
def __secret(self): #定义私有方法
print("私有方法")
pass
tom = Cat() # 创建对象
tom.get_age()
tom.__secret() #外部无法访问私有方法
print(tom.__age) #外部无法访问私有属性
print(tom._Cat__age) # 外部访问私有属性
## 类的继承
class Animal:
def eat(self):
print("eat")
def drink(self):
print("drink")
class Cat(Animal): #在类中传递需要继承的类名,子类拥有父类的所有属性和方法
def eat(self): # 子类中重写方法,后续调用时会覆盖父类中的方法
print("eat重写")
tom = Cat() # 创建对象
tom.eat() # 可以执行继承的类的方法
tom.drink()
专业说法:Cat类继承自Animal类,是Animal类的子类,也可说Cat类是Animal类的派生类
### 使用super方法调用父类同名的方法
class Animal:
def eat(self):
print("eat原版")
def drink(self):
print("drink")
class Cat(Animal):
def eat(self):
print("eat重写")
super().eat() #使用super对象,调用父类同名的方法
tom = Cat() # 创建对象
tom.eat()
Animal.eat(tom) #python2 早期版本没有super,调用父类的其他方法
### 多继承
class A:
def eat(self):
print("eat原版")
class B:
def eat(self):
print("eat重写")
class C(A,B): # 继承多个父类
pass
## 类的属性和方法
### 类属性
class Tool:
count = 0 # 定义一个类属性
def __init__(self):
Tool.count += 1 # 操作类属性的值
tool1 = Tool()
print(Tool.count) # 使用类名打印类属性 (推荐类名访问类属性)
print(tool1.count) # 使用实例化对象打印类属性
### 类方法
class Tool:
count = 0
def __init__(self):
Tool.count += 1
@classmethod # 通过classmethod关键字声明下面定义的方法是类方法
def show_count(cls):
print(cls.count) # 类方法中可以通过cls对象调用类属性
tool1 = Tool()
Tool.show_count() #通过类名调用类方法
tool1.show_count()
## 类中的静态方法
class Tool:
@staticmethod #通过staticmethod关键字定义静态方法
def show_static_func(): # 静态方法不传递self参数对象
print("这是静态方法")
Tool.show_static_func() #通过类名调用静态方法
# 异常处理 try
try:
num = int(input("请输入一个整数"))
except: # 捕获异常,如输入a字母则执行下方代码
print("请输入正确的整数")
## 针对已知的错误异常抛出对应的错误信息
try:
num = int(input("请输入一个整数"))
result = 8 / num
except ZeroDivisionError: #除数为0
print("除0错误")
except ValueError: # 错误的值
print("请输入整数")
## 捕获未知错误,和else,finally执行逻辑
try:
num = int(input("请输入一个整数"))
result = 8 / num
except Exception as result: # 捕获未知错误并返回未知信息result
print("未知错误%s" % result)
else:
print("无异常时执行")
finally:
print("无论是否有异常都执行")
## 主动抛出异常并捕获
def input_password():
pwd = input("请输入密码")
if len(pwd) >= 8:
return pwd
print("抛出异常")
ex = Exception("密码长度不够") #通过Exception方法定义异常
raise ex #通过 raise方法抛出异常
try:
input_password()
except Exception as result: # 捕获抛出的异常
print(result)
# 模块操作
## 给导入的模块其别名
import ta_02_mode as TryMode # 别名使用大驼峰命名
## from … import 导入模块中的部分工具
from ta_02_mode import input_password
from ta_02_mode import input_password as input_password2 # 局部导入使用别名
input_password() # 使用部分导入,可以直接通过函数名调用
from ta_02_mode import * # 导入模块中所有工具(不推荐使用)
## 在模块中使用__name__判断当前模块中代码的执行主体,如果为__main__表示模块被直接执行不是导入
因为模块在导入加载时,所有的代码都会被执行一遍
执行下面的代码
from ta_02_mode import input_password
input_password()
ta_02_mode中的代码
def input_password():
pwd = input("请输入密码")
if len(pwd) >= 8:
return pwd
print("抛出异常")
ex = Exception("密码长度不够")
raise ex
if __name__ == "__main__": # 通过这个判断,如果是导入则不执行下面的代码
print("这是模块中执行的代码1")
print("这是模块中执行的代码2") # 只要文件被运行,无论导入还是直接执行这段都会执行
# 包(Package)操作
## 包的概念
包是一个包含多个模块的特殊目录
目录下有一个特殊的文件 __init__.py
包的命名方式和变量名一致,小写字母+_
## 创建模块并导入案例:
创建目录
py_package
创建__init__.py文件并在文件中写上
from . import send_message # 导入需要定义给包调用的模块
创建send_message.py模块文件并在文件中定义方法
def send_msg():
print("发送信息")
在其他文件中引入包,并调用包中的方法
import py_package
py_package.send_message.send_msg() #调用方法
## 使用pip3包管理工具安装和卸载模块
sudo pip3 install pygame
sudo pip3 uninstall pygame
# 使用python操作文件
## 读取文件内容
file = open("README") # 打开文件
text = file.read() # 读取文件,read方法执行完后会将程序指针移动到文件末尾
print(text)
text = file.read() # 再调用read由于指针已经移动到末尾,再次read读取不到文件
print(text) # 打印为空
file.close() # 关闭文件,注:打开文件后必须关闭文件,否则会一直占据内存
### 只读取一行文件内容
file = open("README")
file.readline() # 只读取一行文件内容,并将指针移动到下一行文件中
## 文件中写入内容的几种模式
file = open("README", "r") # 只读模式
file = open("README", "w") # 只写模式,写入内容并覆盖之前的内容
file = open("README", "a") # 追加写入模式,在文件末尾写入内容
## 使用os模块进行目录管理
### 文件重命名
os.rename(“hello.txt”,“123.txt”)
### 删除文件
os.remove(“123.txt”)
### 创建目录名
os.mkdir(“test”)
…
# eval函数的使用
对字符串进行计算:
eval(“1+1”) # 输出结果2
将字符串转换为列表:
type(eval(“[1,2,3,4,5]”)) # 输出list
将字符串转换为字典:
type(eval(“{‘name’: ‘name’, ‘age’: ‘18’}”)) # 输出dict
## 不要使用eval转换用户输入的input内容,因为代码命令都会执行
比如目录操作代码 __import__(‘os’).system(‘ls’)等