当前位置: 首页 > news >正文

Python3入门与进阶笔记(六):初识类

目录

一些解释

属性


类名建议首字母大写,通常用驼峰规则命名。变量名建议小写,下划线隔开。类最基本的作用是封装。

写在类内非方法中的语句在类加载的时候会执行,且只会执行一次,例如下面的print语句,类加载时就会打印Person类 2。类属性在类加载的时候定义。

class Person(object):sex = 'male'  # 类属性money = 2  # 类属性def __init__(self, name, age=None):  # 实例方法之构造方法self.name = name  # 实例属性self.age = age  # 实例属性def run(self):  # 实例方法print(self.get_sex())return f"{self.name} 在跑"# 类加载的时候会执行,且只会执行一次print(f"Person类 {money}")@classmethoddef get_sex(cls):  # 类方法print(cls.get_money())return f"Person类 {cls.sex}"@staticmethoddef get_money():  # 静态方法return f"Person类staticmethod {Person.money}"if __name__ == "__main__":print("=" * 20)print(Person.get_money())print("=" * 20)print(Person.get_sex())print("=" * 20)alice = Person('alice', 2)print(alice.run())

一些解释

  • self
    • 定义访问修改实例属性、调用方法,通过self.
    • 一般用于实例方法,作为第一个形参,代表当前实例
    • 必须传入,在通过实例对象.调用实例方法的时候,python解释器会自动将实例对象传给self,这也就是为啥在实例方法里面可以通过self.访问实例属性、方法,因为其绑定到了当前对象
  • cls
    • 调用类方法,通过cls.
    • 一般用于类方法,作为第一个形参,代表当前类
    • 必须传入,在通过类名.调用类方法的时候,python解释器会自动将类传给cls,这也就是为啥在类方法里面可以通过cls.访问实例属性、方法,因为其绑定到了当前类

属性

  • 类属性
    • 定义于类中个各方法的外部
    • 在类加载的时候定义
    • 建议通过类名.直接调用和修改,在类方法中,建议通过cls.,虽然类名.也可以,但是不便于维护
    • 类属性建议通过cls.、类名.访问修改
    • 类属性可以通过self.、实例对象.访问,但是不能通过它修改,因为表面看上去修改了它的值,其实是给当前对象定义(访问、修改)了一个与类属性同名的实例属性,特别的当我们在类的外部通过实例对象.,就会更可怕,因为只有该实例对象拥有了这个与类属性同名的实例属性,其它的实例对象没有该实例属性。
  • 实例属性
    • 定义在实例方法内部
    • 建议定义在__init__构造函数内部,这样我们对类进行实例化的时候,这个实例化对象就会拥有其实例属性,不需要我们显示的调用。若定义在其它实例方法内部,则直到调用那个实例方法该对象才会拥有那些属性
    • 因其定义在实例方法内部,所以我们必须通过self.来定义访问修改,不加self.仅是该实例方法的局部变量,而不属于实例属性

方法

实例方法:

  • 可访问修改实例属性
  • 通常只能访问类属性(self.不能修改类属性,只是创建了同名的实例属性),但是可以通过类名.强制修改类属性
  • 通过对象名.调用,在实例方法内可以直接通过self.调用
  • 构造方法是特殊的实例方法,__init__(self),自动执行,可以不写return,此时返回类型是None,不能强制返回其他类型

类方法:

  • 不可访问实例属性
  • 可以访问修改类属性
  • 通过类名.调用(也可通过对象名.调用,不推荐),在类方法内可以直接通过cls.调用

静态方法:定义加@staticmethod,不用多传一个形参。可以用类也可以用对象调用静态方法,静态方法也可以访问类变量,和类方法没啥太多区别,在静态方法中不可以访问实例变量。不推荐用静态方法,因为静态方法不是很能体现面向对象的特点。

  • 不可访问实例属性
  • 可以访问修改类属性(通过类名.)
  • 通过类名.调用(也可通过对象名.调用,不推荐)

通过在方法名前加__将方法变为私有的,在外部不可以通过对象名/类名.__方法名访问。python在类外部可以通过对象名.变量名添加实例变量。严格来讲python并没有真正的私有变量,因为可以通过对象名._类名__变量名。

继承

python支持多继承和多重继承。魔法方法类名.__mro__可以查看继承顺序。

例如上图,图上的左右是继承时写在括号中的左右的顺序,继承顺序由先至后如下,这也是继承时不同的父类有同名属性和同名方法的查找路径。

<class '__main__.E'>, <class '__main__.D1'>, <class '__main__.C1'>, <class '__main__.C2'>, <class '__main__.B1'>, <class '__main__.A1'>, <class '__main__.A2'>, <class 'object'>

 <class '__main__.E'>, <class '__main__.A3'>, <class '__main__.C2'>, <class '__main__.D1'>, <class '__main__.C1'>, <class '__main__.B1'>, <class '__main__.A1'>, <class '__main__.A2'>, <class 'object'>

 

<class '__main__.E'>, <class '__main__.D1'>, <class '__main__.C1'>, <class '__main__.B1'>, <class '__main__.A1'>, <class '__main__.B2'>, <class '__main__.C2'>, <class '__main__.B3'>, <class '__main__.A2'>, <class 'object'>

我们可以看到大致路径是这样的,先从最左边的父类一步一步往上找(每次也只找最左侧的父类)类似于深度搜索;若是发现该父类还有其它子类,则我们回过头去走那些没有走过的路(例如到了A2,发现还可以从E->D1->C2->B3,其中只有C2->B3未遍历,所以加进去)

http://www.lryc.cn/news/42537.html

相关文章:

  • Prometheus监控实战系列九:主机监控
  • JVM知识整理
  • 【C++】二叉搜索树
  • leetcode -- 21. 合并两个有序链表
  • 计算机组成原理|第四章(笔记)
  • 【Unity3D-BUG记录】Unity3D中出现“动画片段必须标记为Legacy的警告”消除方法
  • Spring Bean的定义(含创建Bean的三种方式)
  • vue的路由-vue router(一)
  • DevOps流水线搭建-PHP版本
  • C语言之按位取反~(七十一)
  • C# 委托
  • leetcode究极刷题笔记(11~15)
  • 【C语言】一篇带你从零了解 枚举
  • 用Pytorch搭建一个房价预测模型
  • 《Netty》从零开始学netty源码(十五)之ServerSocketChannel
  • Java stream性能比较
  • 【数据结构与算法】设计循环队列
  • 最新版!国内IT软件外包公司汇总~
  • MySQL的COUNT语句,竟然都能被面试官虐的这么惨!?
  • 数位DP 详解及其案例实战 [模板+技巧+案例]
  • 并发编程(六)—AbstractExecutorService源码分析
  • 015行为型-职责链模式
  • python例程:五子棋(控制台版)程序
  • leveldb的Compaction线程
  • 邪恶的想法冒出,立马启动python实现美女通通下
  • 蓝桥杯刷题冲刺 | 倒计时18天
  • 经典算法面试题——Java篇-附带赠书活动,评论区随机选取一人赠书
  • 支持RT-Thread最新版本的瑞萨RA2E1开发板终于要大展身手了
  • 【C语言进阶】 12. 假期测评①
  • 给程序加个进度条吧,1行Python代码,快速添加~