# 案例:九九乘法表
\t 在控制台输出一个 横向制表符,协助在输出文本时 垂直方向 保持对齐
\n 在控制台输出 换行符
\" 在输出字符串时,为了避免混淆,用于输出 双引号
\\ 在输出字符中有\,为了防止与python中的转义字符\(python中\表示转义符的开始)混淆,需要将字符串中的\换成\\,或者在字符串前加r
print('1\t2\t\3')
print('10\t20\t39')
# 输出:
1 2 3
10 20 39
print('Hello\nWorld')
print('Hello\\World')
print(r'Hello\nWorld')
# 输出: Hello
# World
# 输出:Hello\World
# 输出:Hello\nWorld
print("\"你好我是一只猫咪\"")
# 输出: "你好我是一只猫咪"
语法:dir(函数名、变量名、数据)
addr=id('HELLO WORLD')
print('%d'%addr) # 按十进制输出地址
print('%x'%addr) # 按十六进制输出地址
__init__函数 初始化函数,实例属性的创建,有self以外的参数时,在创建对象的时候需要赋予参数
__del__函数 在程序执行完成之后会 自动调用,删除创建好的对象。程序全部执行完之后才会自动调用,删除创建好的对象
__str__函数 可以实现自定义输出内容。如果类中没有__str__函数,直接print(对象)时,会输出这个变量所引用的对象 是 由哪一个创建的对象,以及在内存中的地址。 如果直接print对象时想输出自定义的内容,就得在类中使用__str__函数。(必须用return返回结果)
class Cat:
def __init__(self,new_name):
self.name=new_name
def eat(self): #哪个对象调用该方法,self就引用的哪个对象
print('%s爱吃鱼'%self.name)
#调用方法时,不需要传递self的参数
#在方法内部,可以通过self. 访问对象的属性、也可以调用其他的对象方法
def __str__(self):
#必须返回一个字符串
return '我是小猫:%s'%self.name
def __del__(self):
print('%s离开了'%self.name)
tom=Cat('Tom') # 创建对象tom
print(tom) # 输出:我是小猫:Tom
# Tom离开了
需求: 1. 房子(House) 有户型、总面积、家具名称列表(新房子没有任何家具)
2.家具(HouseItem)有名字和占地面积,其中 席梦思(bed)占地4平方米 衣柜(chest)占地2平方米 餐桌(table)占地1.5平方米
3.将以上三件家具添加到房子中 4.打印房子时,要求输出:户型、总面积、剩余面积、家具名称列表
步骤:1. 先确定 有几类,有哪些类 2. 再确定类有什么属性 、方法
# 案例:摆放家具
哪一个类要被使用到,就先开发哪一类
需求: 1.士兵 许三多 有一把 AK47
2.士兵可以开火
3.枪可以发射子弹
4.枪装填子弹---增加子弹数量
# 案例:士兵突击
is 和 not is 是判断两个变量的内存地址是否相同
== 和 != 是判断两个变量的值是否相同
特例: 判断是否等于None时,使用 is
def 同名方法名(self): 1. 针对子类特有的需求编写代码 ..... 2. 使用 super().方法名 调用原本在父类中封装的方法 super().子父类同名方法名() 或 父类名.方法(self) # 这种方式不推荐使用 3. 增加其他子类的代码 .....
实例方法 需要访问实例属性(在实例方法中,可以访问类属性 类名.类属性)
类方法 只需要访问类属性
静态方法 既不需要访问实例属性,也不需要访问类属性
既需要访问实例属性,也需要访问类属性,用 实例方法
案例需求:
1. 给出游戏(Game)的帮助信息(show_help) -----不需要调用类属性和实例属性,因此是静态方法
2. 给出游戏最高分(game_top_score) ----- game_top_score是类属性, 给出分数调用的是类属性,所以是类方法
3. 玩家(player_name)开始游戏(start_game) ----player_name是实例属性, 开始游戏是实例方法
# 案例:
必须调用父类的new方法为对象分配内存空间,new方法是静态方法,所以必须输入参数cls
def __new__(cls,*args,**kwargs):
# 1.创建对象时,new方法会被自动调用
print('创建对象,分配空间')# 2.为对象分配空间
instance=super().__new__(cls) #必须调用父类的new方法为对象分配内存空间# 3.返回对象的引用
return instance
# 单例模式设计:
class MusicPlayer(object):
# 创建一个类属性,记录第一个被创建对象的引用
instance = None
def __new__(cls,*args,**kwargs):
# 1.判断类属性是否为空对象(即是否是第一次创建对象)
if cls.instance is None:
# 2.调用父类的new方法,为第一个对象分配空间
cls.instance=super().__new__(cls)
# 3.返回类属性保存的对象的引用
return cls.instance
player1=MusinPlayer()
palyer2=MusicPlayer()
print(player1)
print(player2)
#输出:
# <__main__.MusicPlayer object at 0x00000169A92C7D90>
# <__main__.MusicPlayer object at 0x00000169A92C7D90>
在我们开发时,给文件起名,千万不要和 系统模块文件 重名。模块的搜多顺序:
1. 首先在我们的工作目录中寻找,如果找到就直接导入,不再查找系统目录
2. 如果在当前工作目录中没有找到,才会再搜索 系统目录
在每一个模块中,都有一个内置属性__file__,可以查看 模块 的完整路径。
每一个文件都可以被当作模块被导入。
在实际开发中,所有没有任何缩进的代码都会被执行一遍!
在实际开发中,每一个模块都是独立开发的,大多都有专人负责,因此开发人员通常会在自己的模块下边怎加一些 测试代码。这些测试代码 仅在模块内部使用,而被导入其他文件时不需要执行。
__name__属性:可以做到 测试代码 只有在模块测试情况下被运行,而被导入时不会运行
__name__内置属性,记录一个字符:如果是被其他文件导入的,__name__就是模块名
如果在文件内部执行,__name__就是__main__
# 在模块中的测试代码可以这样写:
def main():
# .....(测试代码)
pass
if __name__ == '__main__':
main()
def input_password():
pwd=input('请输入密码:')
if len(pwd) >=8:
return pwd
print('密码长度不符合规范')
# 1> 创建一个的Exception对象-----可以使用错误信息字符串作为Exception()的参数;
# Exception()创建对象的参数 就是捕获到异常后输出的 result
ex=Exception('请输入长度大于等于8的密码')
# 2> 主动抛出异常
raise ex
try:
# 调用该方法
print(input_password())
# 捕获异常
except Exception as result:
print('捕获异常:%s'%result)
包:包含多个模块 和 一个特殊文件__init__.py 文件
包的名字: 小写字母+下划线(数字不能开头)
方法一:
1. 选中项目-右键-new-Directory-目录名字:‘ ’---->项目中多了一个目录,但是还不是包(Pockage)的目录,包里要有__init__.py
2. 选中该目录-右键-new-Python File-文件名“__init__”---->一个包就建立完成
方法二:
1. 选中项目-右键-new-Python Pockage-包的名字:‘ ’ -----> 包创建完成,有空的__init__文件
__init__.py 文件中 指定对外界提供的模块列表,指定方法:
from . import (模块名) 例如: from . import send_message from . import receive_message # 只有在__init__文件中指定了,外界才能使用该 包(Pockage)