Python学习5

类和对象

类:

  • 类的命名:
    • 必须遵循命名规范,避开系统命名
    • 必须用关键字class
    • 类由属性和方法构成,不能出去其他
    • 成员属性定义可以使用变量赋值,也可以为None
  • 类的实例化:
    • 变量 = 类名()
  • 类对象成员的访问
    • obj.成员属性名 或者 obj.成员方法
  • self
    • self不是关键字,只是用于接收对象的普通参数
    • 方法中有self形参的方法为非绑定类方法,可以通过对象访问,没有self的为绑定类,只能通过类访问
    • 使用类访问绑定类的方法时,如果类方法要访问当前类的成员,可以通过__class__.成员名
      • 如:class A(): a = "hello" def B(); print(__class__.a)
    • 构造方法中,self参数(第一个参数)代表改构成方法正在初始化的对象
    • Python对象的一个方法调用另一个方法的时候,不可省略self
  • 类实例的属性和其对象的实例属性在不对对象属性赋值的前提下,指向同一变量

    重写父类

  • 子类包含与父类同名的方法

封装、继承和多态

封装

  • 封装对对象的成员进行访问限制
  • 封装:公开、受保护及私有
    • 公开
      • 没有对成员进行任何操作
      • 类中,子类及外部都可以进行访问
    • 受保护
      • 封装方法:在成员名称前加一个下划线即可
      • 类或者子类都可以访问,外部不能进行访问
      • Python目前不支持受保护的成员,只是开发者约定的使用方式
    • 私有
      • 封装方法:在成员前面添加两个下划线即可
      • Python其实没有真正的隐蔽机制,双下划线只是Python的一个小技巧: __attributename改成_classname__attributename

继承

  • 子类继承父类的语法是在定义子类时,在子类的圆括号里放入父类(可以放入多个父类)
    • 如:class SubClass(SuperClass,...):
  • Python中定义类并未指定这个类的直接父类,则这个类默认继承object类
  • 被继承的类被称为父类,也可以称为基类或超类
  • 子类继承父类后并没有将所有的成员赋值到子类中,而是通过引用关系访问调用
  • 子类与父类有定义相同成员时,子类优先使用子类成员
  • 子类扩充父类的方法,可以在新定义的方法中访问父类的成员来重用
    • 可以使用父类名.父类成员名或者super().父类成员名的格式来调用
  • 子类可以有独有的成员和方法
  • 构造函数
    • 在类进行实例化之前进行调用
    • 子类如果定义了构造函数,则实例化时使用构造函数,不查找父类构造函数
    • 如果子类没有构造函数,父类构造函数带参数,则构造对象时要按父类参数构造
  • super
    • 不是关键字,是个类
    • 获取MRO列表中的第一个类
    • super与父类没有实质性关系,但可以调用父类
  • 多继承
    • 一个子类有多个直接父类
    • 如:class SubClass(SuperClass1,SuperClass2):
    • Python中虽然支持多继承,但是不推荐在没必要的情况下使用,避免麻烦
    • MRO是多继承中用于保护继承顺序的一个列表
    • MRO列表的计算原则:
      • 子类永远在父类前面
      • 如果多个父类,则根据继承语法中括号内的顺序存放
      • 如果多个类继承同一个父类,则子孙类只会选取继承语法括号中的第一个父类的父类
    • 使用多继承来实现Mixin
    • 使用Mixin实现多继承的时候要小心
      • 首先它必须是表示一单一功能,而不是某个物品
      • 职责必须单一,如果有多个功能,则写多个Mixin
      • Mixin不能依赖子类的实现
      • 子类即使没有继承这个Mixin类,也能照样工作,只是缺少某个功能

        多态

  • 同一个对象在不同情况下有不同的状态出现

检测类型

  • issubclass(cls,class_or_tuple):检测一个类是否是另一个类的子类
  • isinstance(obj,class_or_tuple):检测一个对象是否是另一个类的实例
  • hasattr(obj,name):检测一个对象是否存在某成员
  • setattr(obj,name,values):给对象的属性赋值,若属性不存在,先创建再赋值
  • getattr(object, name[,default]):获取对象的属性或者方法,如果存在打印出来,如果不存在,打印出默认值,默认值可选。如果是返回的对象的方法,返回的是方法的内存地址,如果需要运行这个方法,可以在后面添加一对括号
  • del(obj,name):删除对象属性
  • dir([obj]):获取对象的成员列表

    property函数定义属性

  • 语法格式 :property(fget,fset,fdel,doc)
  • 可根据需要只传入少量的参数

    类内置属性

  • __bases__属性是Python提供的一个为所有类查找该类父类的属性,该属性返回所有直接父类组成的元组
  • __subclasses__()方法是Python提供一个为所有类查找该类子类的方法,该方法返回所有直接子类的列表
  • __dict_-以字典的方式显示类的成员组成
  • __doc__获取类的文档信息
  • __name__获取类的名称,如果在模块中使用 ,则获取模块名称

    魔法函数

  • __new__:对象实例化方法,一般不使用
  • __init__:构造函数
  • __call__:对象当函数使用的时候触发
  • __str__:当对象被当字符串使用时触发
  • __repr__:
  • __setattr__:该方法不能直接对属性进行赋值,否则陷入死循环

    类和对象的三种方法

  • 实例方法
    • 需要实例化对象才能使用的方法
  • 静态方法
    • 使用装饰器@staticmethod。不需要实例化,通过类来直接访问,但是方法体中不能使用类或实例的任何属性和方法
  • 类方法
    • 使用装饰器@classmethod。需要实例化,第一个参数必须是当前类对象,该参数名一般约定为“cls”,通过它来传递类的属性和方法(不能传实例的属性和方法)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值