面向对象特点

  • 注重对象与职责,不同对象,不同职责;
  • 应对复杂项目开发,提供固定模版;
  • 基于面向过程;
  • 封装:根据功能将属性和方法封装到一个抽象的类中;
  • 继承:实现代码复用,相同代码不需多次编写;
  • 多态:不同对象调用相同方法得出不同结果,增加了代码的灵活度;

对象

类创建出来的一个具体存在,可直接使用,拥有类所具有的属性与方法;

类与对象的关系

  • 类是模版,对象根据类创建而出,先有类再有对象;
  • 类只有一个,但对象可以有多个;
  • 类中定义属性与方法,对象中只能具有所创建而出的类所具有的属性与方法;

类的设计三要素

  • 类名:一般满足大驼峰命名法;
  • 属性:一类事物所具有的特征;
  • 方法:一类事物所具有的行为;

添加类的属性

  • 在创建类之后,对象可以在外部直接使用.属性名 给对象增加属性,但是这种方式不推荐使用,因为它并没有将属性封装到类的内部中,只是对象临时的属性;
  • 在初始化方法内部定义属性之后,在使用该类创建新对象时,所创建的新对象都会拥有该属性,使用方法:self.属性名 = 属性初始值

对象及内置方法生命周期

方法 功能
__init_ 初始化对象并设置属性
__del_ 销毁对象
__str_ 必须返回一个字符串,定制变量的输出信息
  • 对象从调用类名()创建时生命周期即开始;
  • 对象生命周期内,既可以访问对象属性,也可以调用对象方法;
  • 对象的__del__方法一旦调用,对象的生命周期即结束;

身份运算符

  • 功能:用于比较两个对象内存地址是否一致–即判断是否是对同一对象的引用;
  • is==的区别
    • is用于判断两个变量引用对象是否为同一个;
    • ==用于判断引用变量的值是否相等;

私有属性与方法

  • 定义方式:属性名或方法名之前增加两个下划线,则定义的属性或方法就是私有属性或方法;
  • 特点:在对象方法外部是不能直接访问的,只有在方法内部才能够访问;
  • 子类对象不能直接访问父类私有属性或私有方法,但可以通过父类的公有方法间接访问私有属性或私有方法;

伪私有属性与方法

  • 对于定义的私有属性与方法,通过_类名__名称的方式即可访问,所以说私有属性或方法并非真正意义的私有,而是内部通过特殊处理伪装起来使得外界无法访问的。虽然私有属性或方法我们都可以访问,但日常开发中最好不要使用这种方式来访问私有属性或方法;

注意

  • 内置函数__str__必须返回一个字符串;
  • 对象的方法内部,可以直接访问对象属性;
  • 对于多个对象之间,各自的属性是互不干扰的;

继承

  • 语法
class A(B):
	pass
  • 子类继承于父类,拥有父类所封装的属性与方法,无需二次开发;
  • 子类只需要封装属于自己特有的,有别于父类的属性与方法即可;
  • 特性:传递性;
  • 方法重写:
    • 覆盖基类方法;
    • 对基类方法进行拓展,需要使用super().父类方法来调用父类方法的执行,然后在方法中其他位置进行对子类方法的扩展;

多继承

  • 语法
class 子类名(父类名1, 父类名2,...):
	pass
  • 注意事项
    • 父类名应该避免重复;
    • 不同父类中的属性或方法应该避免同名;

新式类与经典类

  • 新式类
class A(object):
    pass
  • 经典类
class A:
    pass

实例化

  • 每个对象实例化是都有自己独立的内存空间,用于保存各自不同的属性;
  • 而多个对象的方法在内存中只有一份,在调用方法时需要吧对象的引用传递到方法内部;

类方法

  • 语法
@classmethod
def 类方法名(cls):
    pass
  • 在类方法内部
    • 通过cls.访问类的属性;
    • 通过cls.调用其他类方法;

静态方法

  • 需要封装为静态方法的情况:
    • 无需访问实例属性或实例方法;
    • 无需访问类属性或类方法;
  • 语法
@staticmethod
def 静态方法名():
    pass

实例方法、类方法、静态方法之间的区别

  • 实例方法:方法内部需要访问实例属性,实例方法内部需使用类名.访问类属性;
  • 类方法:方法内部只需要访问类属性
  • 静态方法:方法内部不需访问实例属性类属性