类和对象

类和对象

面向对象编程

  • 面向对象编程(简称oop):是一种解决软件复用问题的设计和编程方法。

    这种方法把软件系统由相似的操作逻辑、数据、状态等以类的形式描述出来,通过对象实例在软件系统中复用,从而提高软件开发效率。

  • 类:一个事物的抽象,定义了一类事物的属性和行为

  • 对象:通过类创建的一个具体事物,它具有状态和行为,可以做具体的事情。

  • 类和对象的关系

    • 类相当于创建对象的模板,根据类可以创建多个对象

  • 类的构成

    • 类的名称

    • 类的属性

    • 类的方法

  • 类的定义

  • 类名的命名规则按照“大驼峰”

  • 定义的方法默认要传入一个self参数,表示自己,self参数必须是第一个参数

  • 创建对象:对象变量名 = 类名()

类的构造方法

  • __int__构造方法

    • 调用时间:在对象被实例化时被程序自动调用

    • 作用:用于对象创建时初始化

    • 书写格式:init前后分别是两个下划线

    • 程序不显示定义init方法,则程序默认调用一个无参init方法

构造一个类

类的访问权限

  • 修改对象属性的方法

    • 方法1:对象变量名.属性 = 新值

    • 方法1的问题:

      • 1)可能修改的属性值不合法

      • 2)在类的外部可以随意修改类的内部属性

    • 方法2:对象变量名.内部修改属性方法

  • 私有属性

    • 定义:__私有变量名,变量名钱是两个下划线

    • 只能在类的内部使用,类外部不能访问,否则报错

  • 私有方法

    • 只能在类内部调用,在类的外部无法调用

    • 定义私有方法在方法前加两个下划线

    • 类内部调用私有方法要使用self.私有方法的方式调用

类的私有属性无法被修改:

私有方法

继承

  • 在程序中,继承描述的是类中类型与子类型之间的所属关系,例如猫和狗都属于动物

  • 单继承

    • 子类继承一个父类,在定义子类时,小括号()中写父类的类名

    • 父类的非私有属性、方法、会被子类继承

    • 子类中方法的查找:先查找子类中对应的方法,如果找不到,再到父类中查找

    • 子类可以继承父类的属性和方法,也可以继承父类的父类的非私有属性和方法,以此类推

    • 在子类中调用父类的方法:ClassName.methodname(self)

  • 多继承

    • object类是所有类的基类,在定义类的时候,不需要显式地在括号中表明继承自object类

    • 多继承:一些子类可以继承多个父类

    • 多继承定义方式:在类名后的括号中添加需要继承的多个类名

    • 多继承中,如果在多个类中有同名的方法,子类调用查找方法的顺序是按照小括号内继承父类从左到右的顺序查找,第一个匹配方法名的父类方法将会被调用

单继承

多继承:(尽量不雅使用相同的方法名称,以免产生分歧)

多态

多态(主要用于JAVA、C#强类型的语言中)

  • 一个抽象类有多个子类,不同的类表现出多种形态

引用其他.py文件中的类

dog_define.py:

dog_use.py:

注意的是,在pycharm中,会发生无法导入同级别其他文件中的类的情况。需要对所在的包右击“Mark directory as”->"sources Root"。

类属性

  • 实例属性

    • 所属于具体的实例对象,不同的实例对象之间的实例属性互不影响

  • 类属性

    • 所属于类对象,多个实例对象之间共享一个类属性

    • 获取类属性方法:类名.类属性

    • 通过实例对象不能修改类属性

      class_attribute

类属性(在所有对象中共享的属性)

如果名称相同,则优先找实例属性,再找类属性:

建议:尽量使用类名.类属性来调用类属性,以免和实例属性混淆。

类方法、静态方法

  • 类方法

    • 所属与类对象,使用@classmethod修饰的方法

    • 定义类方法的第一个参数通常以"cls"参数作为类对象被传入

    • 调用方式:类名.类方法 或者 实例对象.类方法(不推荐)

  • 静态方法

    • 使用@staticmethod修饰的方法,不需要默认传递任何参数

    • 调用方式:类名.静态方法 或者 实例对象.静态方法

静态方法

静态方法几乎和类和对象本身没什么关系,所以不建议使用静态方法。

在类方法和静态方法中,不能直接调用实例属性。

单例类

  • __new__(cls)

    • 超类object类内置的方法,用户创建对象,返回创建对象的引用

    • 先在内存里创建一个对象,在根据__init__添加具体的类的属性

    • 必须要提供cls参数,代表类对象

    • 必须要有返回值,返回创建对象的引用

  • 单例类

    • 在整个程序系统中确保某一个类只有一个实例对象。比如数据库连接的类,确保只有一个数据库连接的类,保证系统的性能。

实例化对象的过程

  • 1、调用__new__方法创建对象,并返回创建的对象的引用。(new是创建具体对象的,而不是创建类属性的,类属性在new之前就已经被python解释器创建了)

  • 2、调用__init__构造方法初始化对象,将先创建的对象的引用作为参数传入,此时self指向的是上一步new方法创建的对象的引用

  • 3、初始化对象结束,将对象的引用返回给具体的对象变量(如例子中的db)

单例类:

异常处理

  • 捕获异常

  • 捕获多个异常

  • 捕获所有可能发生发生的异常

  • finally,常用于关闭文件或数据库连接等程序运行过程中,是否发生异常,程序都要处理。不论是否产生异常,均要执行

  • 函数嵌套异常传递

单个

多个(一旦出错,后面的代码均不会执行)

所有

finally

函数嵌套,也即程序调用时发生异常

包和模块

  • python项目结构

    • 一个项目里有多个包,一个包里有多个模块(.py),一个模块就是一个以.py结尾的文件,一个模块内可以定义变量、函数、类等。

      package_and_model

  • 模块的名字:.py文件的名字

  • 包下可以包含子包

  • 不同包下可以有相同的模块名称,使用“包名.模块名”的方法区分

  • 引入模块的方式

    • 引入单个模块:import model_name

    • 引入多个模块:import model_name1, model_name2, ...

    • 引入模块中的指定函数:

      from model_name import funcc1, func2, ...

  • 包中必须包含一个默认的__init__文件

    • 用于标识一个包,而不是一个普通的文件夹

    • 会在包或者该包下的模块被引入时自动调用

    • 常用于设置包和模块的一些初始化操作

      如__init__.py可写成:

      以便

不同的包之间可以创建同名的模块(.py)。

Last updated

Was this helpful?