python-OOP(面向对象)

封装:

1.python给对象在类的外部增加属性,非常容易但不建议使用,使用.属性名进行增加属性
2.哪一个对象调用的方法,self就是哪一个对象的引用
3.创建对象时python会自动为对象分配内存空间和设置初始值,初始化方法(init)
4.在__init__方法中,使用self.属性名 = 属性值来增加属性
5.对初始化方法改造,增加方法参数,使得self.属性名 = 形参
6.dir()查看对象包含的所有属性和方法
7.__del__方法,对象从内存中销毁前,会自动调用__del__方法
8.del关键字可以删除一个对象
9.对象的生命周期从调用类名开始到调用__del__方法结束
10.__str__方法必须返回字符串,在直接输出对象时会输出地址和类型,如果设置__str__方法,那么将会返回__str__方法中的内容,可以设置返回内容为:return “我是小猫[%s]” % self.name ,这样print(对象名)输出的就是name属性,而不是地址和类型,其实和print(对象.属性)表达意思一致
11.若return中返回值太多,可以使用()将内容包起来,换行抒写
12.开发时先开发被使用的类,初始化方法的中形参只需写需要外部传参的参数,其他内部参数不需要写
13.一个对象的属性可以是另外一个类创建的对象
14.身份运算符,可以使用is和is not比较两个对象的内存地址是否一致;==比较值是否一致
15.私有属性和私有方法:
__私有属性名,在对象的方法内部可以访问对象的私有属性,但在外部不能被直接访问
__私有方法名,在外部不能被直接访问
16.python中没有真正意义的私有,但在开发中不提议
可以在属性的前面加上 _类名__伪私有属性名 进行访问
可以在方法的前面加上 _类名__伪私有方法名 进行访问

继承:

1.语法:class 类名(父类名):子类拥有父类所有的属性和方法
2.专业术语
Dog类是Animal类的子类,Animal类是Dog类的父类,Dog类从Animal类继承
Dog类是Animal类的派生类,Animal类是Dog类的基类,Dog类从Animal类派生
3.继承的传递性,父类可以一直向下传递
4.方法的重写override,
1).覆盖父类的方法,当父类方法不能满足子类需求进行重写,重写的方法,子类对象只会调用子类重写的方法,不会调用父类的方法
2).对父类方法进行扩展,在使用第一个方法覆盖父类方法的时候,可以在其方法内部使用super().父类方法名()即可对父类方法实现继承;也可用父类名.覆盖的方法名(),但不推荐使用,而且若使用当前子类名,会出现死循环
5.子类不能在自己方法内部直接访问父类的私有属性和私有方法,但是子类可以通过调用父类的公有方法间接调用父类的私有属性和私有方法

多继承:

1.语法:class 类名(父类名1,父类名2…):
注意多个父类尽量避免存在同名的属性和方法
2.MRO–方法搜索顺序,按父类顺序一次查找
3.新式类以object为父(基)类,在python3中没有指定父类会默认以object为父(基)类,为了编写的方便,在python2和python3中均使用class类名(object)作为命名方式

多态:

1.多态不同的子类对象调用相同的父类方法,产生不同的执行结果;以继承和重写父类方法为前提

术语
1.创建出来的对象叫做类的实例;创建对象的动作叫做实例化;对象的属性叫做实例属性;对象调用的方法叫做实例方法
2.使用类名()创建对象时,先在内存开辟一个空间,再使用__init__初始化属性
3.每一个对象都有自己独立的内存空间,保存各自不同的属性;多个对象的方法,在内存中只有一份,在调用方法时,需要把对象的引用传递到方法内部
4.万物皆对象,类也是对象叫做类对象,创建的实例叫做实例对象,类对象只有一份,使用一个类,可以创建出多个对象实例
5.类也有属性和方法
6.类属性和实例属性
类属性就是给类对象中定义的属性,通常记录与这个类相关的特征,类属性不会用于记录具体对象的特征。可以使用赋值语句定义类属性,记录所有对象的数量
7.属性的获取机制:向上查找机制。访问类属性一般使用类名.类属性,不建议使用对象.类属性;如果使用,当出现对象.类属性=值的赋值语句时,就会给对象添加该属性,而不会影响到类属性的值,那么在原本想输出类属性的值,就不会向上查找,因为对象中已有该属性
8.类方法和静态方法
类方法语法:
@classmethod
def 类方法名(cls):
pass
和实例方法中self一样,cls在类方法效果相同,在调用方法时,不需要传递cls参数;而且可以在类方法内部,通过cls.属性名来访问类的属性和调用其他的类方法。
类方法可以对类属性进行输出,这样就不需要在类外面进行print输出,可以直接调用类方法输出
9.调用类方法:类名.类方法()
10.静态方法:不访问实例属性或者调用实例方法;也不需要访问类属性或者类方法
@staticmethod
def 静态方法名():
pass
没有第一个参数
通过类名.静态方法名()调用,不需要创建对象
11.实例属性和实例方法都是实例,或者叫对象去调用,而类属性,类方法和静态方法,都是类名直接调用,静态方法不需要创建对象直接调用
12.实例方法:方法内部需要访问实例属性;实例方法内部可以使用类名.访问类属性
类方法:方法内部只需要访问类属性
静态方法:方法内部,不需要访问实例属性和类属性

单例:

1.单例设计模式,一个类只有一个对象,音乐播放对象,回收站对象,打印机对象
2.__new__方法:由object基类提供的内置的静态方法;主要作用包括1)为对象分配空间2)返回对象的引用
3.__init__方法:主要作用包括1)对象初始化2)定义实例属性
4.__new__方法:在重写new方法的时候一定要返回对象的引用,return super().new(cls),该语句实现了new方法的俩个作用,需要传参cls(原因未知)
5.实现单例设计模式,可以先定义一个类属性instance(if判断句)

instance = None

    def __new__(cls, *args, **kwargs):
        # 如果instance为空则说明是第一次创建实例
        # 通过父类的__new__(cls)创建实例
        if cls.instance == None:
            # 调用父类的__new__(cls)方法创建实例,并将该实例赋值给类变量instance,此时该变量的值从None变为该实例
            cls.instance = super().__new__(cls)
        # 返回实例化对象(第一次)或者上一个对象的引用(以后每一次)
        return cls.instance

6.重写new方法时,初始化方法在创建几次对象调用几次init方法,若想只调用一次,那么可以
1)设置类属性init_flag为false
2)在init方法内部判断init_flag是否执行过初始化动作,若执行过,直接返回
3)否则执行初始化动作
4)修改类属性的标记为True

init_flag = False
    def __init__(self):
	# 1.判断是否执行过初始化动作:
        if 类名.init_flag:
	    return
	# 2.如果没有执行过,再执行初始化动作
	print("初始化动作")
	# 3.修改类属性的标记
	类名.init_flag = True

异常:

1.简单的捕获异常 try except 不能确定正常执行的代码放在try中,except放错误的处理代码
2.错误很多时对错误类型捕获

try:
    pass
except 错误类型1:
    pass
except (错误类型2, 错误类型3:
    pass

错误类型是出错的最后一段首个单词

3.捕获未知错误语法
except Exception as 新的名字:
pass
4.try except还有else和finally
else没有异常才会执行的代码,finally无论是否出现异常都会执行代码
5.异常的传递:当函数/方法出现异常,会将异常传递给函数/方法的调用一方;如果传递到主程序,仍然没有异常处理,程序才会被终止。在实际开发中,可利用异常的传递性,在主程序捕获异常
6.抛出raise异常:除了代码执行出错python解释器会抛出异常之外,还可以根据应用程序特有的业务需求主动抛出异常
7.主动抛出异常:1)创建一个Exception的对象2)使用raise关键字抛出异常对象

def input_password():
    
    # 1.提示用户输入密码
    pwd = input("请输入密码:")

    # 2.判断密码长度 >= 8,返回用户输入的密码
    if len(pwd) >= 8:
        return pwd

    # 3.如果 < 8 主动抛出异常
    print("主动抛出异常")
    
    # 1> 创建异常对象
    ex  = Exception("密码长度不够")

    # 2> 主动抛出异常
    raise ex
    
# 提示用户输入密码
try:
    print(input_password())
except Exception as result:
    print(result)

模块:

1.模块别名用大驼峰法,首字母都大写;模块提供全局变量,函数,类
2.from…import若不同模块导入同名函数,后导入函数会覆盖先导入的函数,可使用as解决
3.from…import * 和import 模块名相同,但是from不需要使用模块名.;工作中不建议from,不好排除错误
4.给文件起名字,不要和系统的模块文件重名,否则在想导入系统模块文件时会先导入当前目录同名的文件;__file__可以查看当前模块的路径;搜索顺序是先搜索当前目录,再搜索系统的模块文件
5.如果测试就在if name == “main”:里面编写,这样在其他文件import该文件时就不会执行测试代码

包:

1.是一个包含多个模块的特殊目录;目录下有一个特殊的文件__init__.py;包名的命名方式和变量名一致,小写字母+_,不要以数字开头
2.在外界使用包中的模块,需要在__init__.py写上from . import 模块名,.表示当前目录

模块:

1.发布模块
1).创建setup.py文件(模板)

from distutils.core import setup

setup(name = "hm_message", # 包名
      version = "1.0"# 版本
      description = "itheima's 发送和接收消息模块"# 描述信息
      long_description = "完整的发送和接收消息模块"# 完整描述信息
      author = "itheima", # 作者
      author_email = "[email protected]", # 作者邮箱
      url = "www.itheima.com", # 主页
      py_modules = ["hm_message.send_message",
                    "hm_message.receive_message"])

2).构建模块
python3 setup.py build
3).生成发布压缩包
python3 setup.py sdist

可用tree查看结构

2.安装模块:(ubuntu环境下)
1.tar -zxvf hm_message-1.0.tar.gz
2.sudo python3 setup.py install
使用时候可以直接使用import 包名 直接导入

3.卸载模块:
1.可以使用包名.__file__查看安装路径,然后进入路径,使用sudo rm -r 文件名 来删除

pip安装第三方模块:

1.在MAC下安装ipython:sudo pip install ipython
2.在linux下安装ipython:sudo apt install ipython3

文件:

1.读写指内存和磁盘的交互,读将文件内容读入内存,写将内存内容写入文件
2.open read write close;open函数负责打开文件,并且返回文件对象,其他方法需要通过文件对象来调用
3.先把open和close写好

file = open("文件名")
text = file.read()
print(text)
file.close()  

4.read执行完后指针会跑到读取内容末尾,再执行read时不会读取到任何内容
5.先把open和close写好,open默认只读打开,打开方式有w,r,a,r+,w+,a+

file = open("文件名", "打开方式")
file.write("写入内容")
file.close()

6.按行读取文件内容readline()

file = open("文件名")
while True:
    text = file.readline()
    
    # 判断你是否读取到内容
    if not text:
        break

    print(text)

file.close() 

7.小文件复制

#1.打开
file_read = open("源文件")
file_write = open("目标文件", "w")

# 2.读、写
text = file_read.read()
file_write.write(text)

# 3.关闭文件
file_read.close()
file_write.close()

8.大文件复制

# 1.打开
file_read = open("源文件")
file_write = open("目标文件", "w")

# 2.读、写
while True:
    text = file_read.readline()

    # 判断你是否读取到内容
    if not text:
        break

    file_write.write(text) # 写完一段代码会将指针移动到末尾
    

# 3.关闭文件
file_read.close()
file_write.close()

9.文件目录的常用操作,需要导入os模块
文件操作: os.rename(源文件名,目标文件名) os.remove(文件名)
目录操作: os.listdir(目录名) os.mkdir(目录名) os.rmdir(目录名) os.getcwd()获取当前目录 os.chdir(目标目录)修改工作目录 os.path.isdir(文件路径)判断是否是文件

10文本文件的编码格式(科普)
python2使用ASCII编码,一个ASCII在内存中占用一个字节的空间,一个字符8字符,就是有2的8次,256种
python3使用UTF-8,使用1-6个字节表示,涵盖了地球上所有地区的文字
若想要在python2中使用中文,# - coding:utf8 *-*要加该行代码,但有时候处理带中文字符串会有问题,那么需要在字符串前面加一个u: u"字符串";u就是告诉解释器这是一个utf8编码格式的字符串

11.eval函数:将字符串当成有效的表达式来求值并返回计算结果
12.在开发时不要直接使用eval直接转换input的结果,因为input有可能将文件误删

猜你喜欢

转载自blog.csdn.net/qq_41542989/article/details/108348170