知识点:

  • 类属性与实例属性;
  • 类方法与实例方法;
  • 静态方法;

类属性与实例属性

类属性与实例属性的区别

  • 属性的绑定不同

    • 类属性与当前类相关(绑定的是当前类),与当前类创建的任何对象无关;
    • 实例属性与当前对象相关(绑定的是当前对象);
  • 访问方式不同

    • 对于类属性,可以通过类名,进行访问,也可以通过对象进行访问。但是,通过对象进行访问,属于“只读访问”,我们不能对其进行修改;
    • 对于实例属性,只能通过创建的对象,进行访问,不能通过类名进行访问;

什么时候定义类属性?什么时候定义实例属性呢?

  • ① 定义类属性

不同对象都一致(完全一样)的属性,定义为"类属性",被大家共享。像desc = "人的描述",只有一个。

  • ② 定义实例属性

不同对象都不一样的属性,定义为"实例属性",被个人独享。像name,age,不同对象一般是不同的。

再次提醒:实例属性定义在init方法中,是不同对象所独享;类属性定义在类中,能被不同对象共享。

下面来看一个案例:

  1. class Person:
  2. # 类属性
  3. desc = "人的描述"
  4. def __init__(self, name, age):
  5. # 实例属性
  6. self.name = name
  7. self.age = age
  8. p = Person("梁同学", 18)

访问类属性

强烈建议,类属性总是通过类名去访问。

① 通过类名

  • 访问类属性(可以修改类属性)

  • 修改类属性(可以修改成功)

② 通过对象

  • 访问类属性(只能是只读模式访问,不能通过对象修改类属性)

  • 修改类属性,修改时不会报错,但是并没有真正修改成功。

通过对象修改类属性,其实并不是修改类属性,而是动态地给对象p增加了一个属性desc,只不过这个属性名desc,和类属性desc,具有相同的名称而已。

访问实例属性

实例属性只能够通过,创建的对象,进行访问。

  1. class Person:
  2. # 类属性
  3. desc = "人的描述"
  4. def __init__(self, name, age):
  5. # 实例属性
  6. self.name = name
  7. self.age = age
  8. p = Person("梁同学", 18)

① 通过对象,访问实例属性

② 通过类名,访问实例属性,会报错

类属性与实例属性 知识总结

实例属性: 实例属性是对象独享的,每个对象都有自己的实例属性,彼此之间不受干扰。某个对象改变了自身的实例属性,对其他对象不会造成影响。

类属性: 类属性为类所有。由所有对象所共享(不属于任何对象)。一旦类属性发生了改变,会影响到所有对象。

类方法与实例方法

类方法与实例方法的相关解释

我们先来看一个例子:

  1. class Person:
  2. # 实例方法
  3. def walk(self):
  4. print("走路")
  5. # 类方法,使用@classmethod修饰
  6. # 类方法的第一个参数是固定的。根据惯例,将其命名为cls。但这也不是必须的。
  7. @classmethod
  8. def cm(cls):
  9. # cls就是Person
  10. print("这是类方法")
  11. print(cls is Person)
  12. p = Person()

观察上述例子,对于类方法,有下面几点需要注意:

  • 注意1 :类方法,使用@classmethod修饰;
  • 注意2 :类方法的第一个参数是固定的。根据惯例,将其命名为cls;
  • 注意3 :cls就是Person;
  • 注意4 :类方法的第一个参数会隐式传递,无需我们显式传递;

访问类方法

有两种方法可以访问类方法。但是强烈建议,类方法通过类名来访问。

① 通过类名访问类方法

② 通过对象访问类方法

访问实例方法

实例方法只能通过对象访问,而不能通过类名访问。

① 通过对象访问实例方法

② 通过类名访问实例方法,会报错

通过类名也不是不能访问实例访问,只是需要我们传入一个对象。尽管语法支持,但是不建议这样做。

实例方法与类方法 知识总结

实例方法 : 既可以通过对象调用实例方法,也可以通过类名调用实例方法。只不过通过类名调用实例方法,需要显示传递对象,画蛇添足,不建议这么做。

类方法 : 既可以通过类名调用类方法,也可以通过对象调用类方法。但是,强烈建议,通过类名调用类方法。

“类方法”与“实例方法”,对“类中属性”进行访问

最好,通过实例方法访问实例属性,通过类方法访问类属性。

  1. class Person:
  2. desc = "人的描述"
  3. def __init__(self, name):
  4. self.name = name
  5. def walk(self):
  6. # 实例方法访问实例属性
  7. print(self.name + " is walking")
  8. @classmethod
  9. def c_m(cls):
  10. # 尽管这种方式可以修改类属性。但是属于硬编码(表示代码写的太死了),不建议这么做
  11. # Person.desc = "abcd" # 假如以后类名Person修改了,这里还需要修改
  12. # 因为cls就是Person,所以可以用以下方式修改类属性
  13. cls.desc = "abcd" # 以后就算是:类名Person修改了,这里也不用动。
  14. p = Person("张三")
  15. p1 = Person("李四")

结果如下:

静态方法

先来看一个例子:

  1. class Person:
  2. @staticmethod
  3. def s_m():
  4. print("这是静态方法")
  5. # 因为没有self和cls。既不能访问类属性,也不能访问实例属性。但是有什么用呢?没多大作用,其实。不用太关心这个
  6. p = Person()

结果如下:

通过上面的例子,关于静态方法需要注意以下几点:

  • 注意1 :静态方法使用@staticmethod 修饰,也与所创建的对象无关;
  • 注意2 :没有self和cls参数。不能访问类属性,也不能访问实例属性。但是有什么用呢?没多大作用;
  • 注意3 :静态方法最好通过类名去访问,虽然对象也可以访问;

Python基础(二十):面向对象“类”第三课——类成员的更多相关文章

  1. Bootstrap <基础二十九>面板(Panels)

    Bootstrap 面板(Panels).面板组件用于把 DOM 组件插入到一个盒子中.创建一个基本的面板,只需要向 <div> 元素添加 class .panel 和 class .pa ...

  2. Bootstrap <基础二十五>警告(Alerts)

    警告(Alerts)以及 Bootstrap 所提供的用于警告的 class.警告(Alerts)向用户提供了一种定义消息样式的方式.它们为典型的用户操作提供了上下文信息反馈. 您可以为警告框添加一个 ...

  3. Bootstrap <基础二十八>列表组

    列表组.列表组件用于以列表形式呈现复杂的和自定义的内容.创建一个基本的列表组的步骤如下: 向元素 <ul> 添加 class .list-group. 向 <li> 添加 cl ...

  4. Bootstrap <基础二十六>进度条

    Bootstrap 进度条.在本教程中,你将看到如何使用 Bootstrap 创建加载.重定向或动作状态的进度条. Bootstrap 进度条使用 CSS3 过渡和动画来获得该效果.Internet ...

  5. Bootstrap<基础二十四> 缩略图

    Bootstrap 缩略图.大多数站点都需要在网格中布局图像.视频.文本等.Bootstrap 通过缩略图为此提供了一种简便的方式.使用 Bootstrap 创建缩略图的步骤如下: 在图像周围添加带有 ...

  6. Bootstrap <基础二十二>超大屏幕(Jumbotron)

    Bootstrap 支持的另一个特性,超大屏幕(Jumbotron).顾名思义该组件可以增加标题的大小,并为登陆页面内容添加更多的外边距(margin).使用超大屏幕(Jumbotron)的步骤如下: ...

  7. Bootstrap<基础二十> 标签

    Bootstrap 标签.标签可用于计数.提示或页面上其他的标记显示.使用 class .label 来显示标签,如下面的实例所示: <!DOCTYPE html> <html> ...

  8. Python 基础 二

    Python 基础 二 今天对昨天学习的Python基础知识进行总结,学而不思则惘,思而不学则殆! 一.先对昨天学习的三大循环的使用情况进行总结: 1.while循环的本质就是让计算机在满足某一条件的 ...

  9. shell基础二十篇 一些笔记

    shell基础二十篇 转自 http://bbs.chinaunix.net/thread-452942-1-1.html 研讨:Bash 内建命令 read (read命令更具体的说明见博客收藏的一 ...

随机推荐

  1. 2020 web developer roadmap

    2020 web developer roadmap https://github.com/kamranahmedse/developer-roadmap https://roadmap.sh/ ht ...

  2. 新手如何通过内存和NGK DeFi Baccarat进行组合投资?

    区块链市场在2020年迎来了大爆发,资本市场异常火热.无论是内存,还是DeFi,都无疑是这个火爆的区块链市场中的佼佼者.通过投资内存和DeFi,很多投资者都已经获取了非常可观的收益,尝到了资本市场带来 ...

  3. RocketMq灰皮书(二)------本地部署启动MQ

    RocketMq灰皮书(二)------本地部署启动MQ Windows10本地部署RocketMQ 在上一篇文章中,我们对rocket的几个基本概念进行了介绍,也了解了业内几大消息中间件的区别.在本 ...

  4. ubuntu无法连接有线网

    问题描述: ubuntu下仅能连接无线网,不能连接有线网,在有线网的下面是没有选项可供连接. 解决方法: 编辑 /etc/network/interfaces 这个文件 将里面仅仅写两句话 auto ...

  5. java放射机制的学习心得

    概述 之前在了解Spring的类加载机制的时候,了解了java的反射机制.但是,我对反射理解一直不深.也一直有点疑惑:Spring为什么利用反射创建对象?直接new对象和依靠反射创建对象有什么区别?什 ...

  6. 翻译:《实用的Python编程》02_06_List_comprehension

    目录 | 上一节 (2.5 collections模块) | 下一节 (2.7 对象模型) 2.6 列表推导式 一个常见的任务是处理列表中的项(译注:元素).本节介绍列表推导式,完成此任务的强大工具. ...

  7. centos7.5+nginx+php急速配置

    centos7.5+nginx+php急速配置 centosnginxphp 更新系统以及添加源 yum update yum -y install epel-release 安装php以及配置 yu ...

  8. Java 中为什么要设计包装类

    尽人事,听天命.博主东南大学硕士在读,热爱健身和篮球,乐于分享技术相关的所见所得,关注公众号 @ 飞天小牛肉,第一时间获取文章更新,成长的路上我们一起进步 本文已收录于 「CS-Wiki」Gitee ...

  9. 翻译:《实用的Python编程》05_00_Overview

    目录 | 上一节 (4 类和对象) | 下一节 (6 生成器) 5. Python 对象的内部工作原理 本节介绍 Python 对象的内部工作原理.来自其它语言的程序员通常会发现 Python 的类概 ...

  10. classLoader动态加载技术

    //加载器,apkPath为包含dex文件的.apk或jar路径,dexPath是优化后的dex文件路径,第三个表示libraryPath表示Native库的路径,最后是父类加载器 DexClassL ...