复习~补充知识

1. 默认情况下,print( )函数会自动在输出内容后面加一个 换行。因此,如果结尾变成print( ' ',end=" ") 就不会出现换行。(案例:九九乘法表)

# 案例:九九乘法表

2. 转义符:  \t    \n   \"    \\

\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("\"你好我是一只猫咪\"")
# 输出:    "你好我是一只猫咪"



3. dir函数:查看对象内的所有属性和方法,变量、数据、函数都是对象

语法:dir(函数名、变量名、数据)

4. 内存地址的输出:%d为十进制,%x为十六进制

addr=id('HELLO WORLD')
print('%d'%addr)   # 按十进制输出地址
print('%x'%addr)   # 按十六进制输出地址

5. 类的定义 和 对象的创建 和 对象的删除

__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离开了

6. 案例:摆放家具

需求: 1. 房子(House) 有户型、总面积、家具名称列表(新房子没有任何家具)   

            2.家具(HouseItem)有名字和占地面积,其中 席梦思(bed)占地4平方米 衣柜(chest)占地2平方米 餐桌(table)占地1.5平方米

            3.将以上三件家具添加到房子中 4.打印房子时,要求输出:户型、总面积、剩余面积、家具名称列表

步骤:1. 先确定 有几类,有哪些类    2. 再确定类有什么属性 、方法   

# 案例:摆放家具

7. 案例:士兵突击

哪一个类要被使用到,就先开发哪一类

需求: 1.士兵 许三多 有一把 AK47

            2.士兵可以开火

            3.枪可以发射子弹

            4.枪装填子弹---增加子弹数量

# 案例:士兵突击

8. is      not is        ==        !=     的区别和联系

is 和 not is  是判断两个变量的内存地址是否相同

== 和 !=       是判断两个变量的值是否相同

特例: 判断是否等于None时,使用 is

9. 子类可以继承父类中的所有属性和方法,并且可以重写父类中的方法。

    当父类的方法实现不能满足子类的需求时,就可以对父类的方法进行重写!

    子类重写父类方法之后,子类对象调用该方法,只会调用子类的方法。

    重写父类的方法:覆盖 或 扩展该方法 在子类中扩展父类的方法

    步骤:

def 同名方法名(self):
    1. 针对子类特有的需求编写代码
        .....
    2. 使用 super().方法名  调用原本在父类中封装的方法
        super().子父类同名方法名()
    或
        父类名.方法(self)     # 这种方式不推荐使用
    3. 增加其他子类的代码
        .....

10. 类方法、实例方法、静态方法 |  类属性、实例属性

实例方法  需要访问实例属性(在实例方法中,可以访问类属性 类名.类属性)

类方法  只需要访问类属性

静态方法  既不需要访问实例属性,也不需要访问类属性

                既需要访问实例属性,也需要访问类属性,用 实例方法

案例需求:

1. 给出游戏(Game)的帮助信息(show_help) -----不需要调用类属性和实例属性,因此是静态方法

2. 给出游戏最高分(game_top_score) ----- game_top_score是类属性, 给出分数调用的是类属性,所以是类方法

3. 玩家(player_name)开始游戏(start_game) ----player_name是实例属性, 开始游戏是实例方法

# 案例:

11. 单例设计模式 :__new__方法的实现,不管创建几个对象,内存地址都是同一个

必须调用父类的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>

12. 导入模块时:

不推荐使用 from xxx import * ,不好排查 不同模块中的重名函数

import xxx (as xxx)

from xxx import xxx (as xxx) 

在我们开发时,给文件起名,千万不要和 系统模块文件 重名。模块的搜多顺序:

1. 首先在我们的工作目录中寻找,如果找到就直接导入,不再查找系统目录

2. 如果在当前工作目录中没有找到,才会再搜索 系统目录

在每一个模块中,都有一个内置属性__file__,可以查看 模块 的完整路径。

每一个文件都可以被当作模块被导入。

在实际开发中,所有没有任何缩进的代码都会被执行一遍!

在实际开发中,每一个模块都是独立开发的,大多都有专人负责,因此开发人员通常会在自己的模块下边怎加一些 测试代码。这些测试代码 仅在模块内部使用,而被导入其他文件时不需要执行。

__name__属性:可以做到 测试代码 只有在模块测试情况下被运行,而被导入时不会运行

__name__内置属性,记录一个字符:如果是被其他文件导入的,__name__就是模块名

                                                             如果在文件内部执行,__name__就是__main__

# 在模块中的测试代码可以这样写:
def main():
    
        # .....(测试代码)
        pass

if __name__ == '__main__':
    main()
    

13. raise如何主动抛出异常---然后捕获异常

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)

14. 包(Pockage)的创建

包:包含多个模块 和 一个特殊文件__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)

你可能感兴趣的:(Python基础,html,前端)