问题

今天在项目中遇到了个奇怪的问题,实例的一个时间属性并没有根据时间变化而变化,分析之后恍然大悟,总结下分享给大家。大家先看一段代码:

import datetime
import time class Person(object):NOW = datetime.datetime.now()def __init__(self):self.now = self.NOWdef dosomething():"""使用self.now 处理了些逻辑"""if __name__=='__main__':for i in range(10):p = Person()print(p.now)time.sleep(1)

且不说代码的优劣,大家觉着最后的打印会是什么样的呢?按照逻辑分析,在for循环中实例化了Person类,而now属性是实例的属性,每次调用在循环中打印,输出的一定是当时循环执行到该次循环的时间,即10次循环打印出的时间是不一样的。然而结果是这样的:

2019-11-06 11:27:28.695771
2019-11-06 11:27:28.695771
2019-11-06 11:27:28.695771
2019-11-06 11:27:28.695771
2019-11-06 11:27:28.695771
2019-11-06 11:27:28.695771
2019-11-06 11:27:28.695771
2019-11-06 11:27:28.695771
2019-11-06 11:27:28.695771
2019-11-06 11:27:28.695771

分析

这里边体现了类属性实例属性的区别。NOW 属于类属性,now属于实例属性。我们知道类属性可以被类和实例调用,实例属性只能被实例调用。我们在日常的业务逻辑开发中,并不会特意的去区分类属性和实例属性,而是直接使用实例来调用所有的属性,几乎不会使用类来调用属性。上边的代码在__init__中将类属性赋值给了实例属性,调用实例属性now时,间接的调用了类属性NOW。而类属性,在类加载的时候就执行了,即获取了当时的时间。它并不会随着实例的调用而改变。

总结

这里总结下类属性和实例属性的区别:

  • 类属性可以被类和实例调用,实例属性只能被实例调用
  • 类属性不会随着实例的调用而改变
  • 类属性的有效作用域只有类,实例属性的有效作用域只有本实例(有效作用域并非官方描述,而是我做的一个类比,大家可与作用域类别)。

其中第三句需要再解释下,当类属性被实例属性调用修改时,修改的只是实例作用域内的该属性值,并不会修改类的属性。大家可以看如下例子:

class Persion(object):count = 0def __init__(self):self.name = '人'if __name__ == '__main__':p = Persion()p.count += 1print(p.count)print(Persion.count)# output
1
0

推荐阅读

更多关于类属性和实例属性的资料,大家可阅读如下资料:

  • https://www.python-course.eu/python3_class_and_instance_attributes.php
  • https://www.geeksforgeeks.org/class-instance-attributes-python/

一个类的实例是另一个类的属性python_Python中的类属性和实例属性引发的一个坑...相关推荐

  1. Eval.cs的改进版 动态编译类,可以计算表达式,也可以调用系统中的类

    Eval.cs的改进版 动态编译类,可以计算表达式,也可以调用系统中的类 /* 动态编译类,可以计算表达式,也可以调用系统中的类 调用方式:     return new XXXXXXX.Eval() ...

  2. python实例属性与类属性_Python中的类属性和实例属性引发的一个坑-续

    上篇文章Python 中的类属性和实例属性,我们探讨了类属性和实例属性引发的一个小坑.总结了类属性和实例属性的区别如下:类属性可以被类和实例调用,实例属性只能被实例调用 类属性不会随着实例的调用而改变 ...

  3. python中实例方法与实例属性-Python中的类属性和实例属性以及静态方法和类方法...

    可以在Python的类定义中直接添加静态变量,如下例中的foo.此属性属于类C,可以直接通过C.foo访问,而无需实例化它.而实例属性则只存在于对象的实例中,这也就意味着,每一个不同的实例都有只属于自 ...

  4. python 元类的call_【原创】Python 对象创建过程中元类, __new__, __call__, __init__ 的处理...

    原始type: type是最原始的元类,其__call__方法是在你使用" t_class = type(classname_string, base_classes_tuple, attr ...

  5. for循环语句例题及解析python_Python中for循环控制语句用法实例

    Python中for循环控制语句用法实例 这篇文章主要介绍了Python中for循环控制语句用法,较为详细的分析了for循环语句的原理与相关使用技巧,本文实例讲述了Python中for循环控制语句用法 ...

  6. python类的动态方法是什么_如何在python中为类动态创建类方法

    如果我将一个小python程序定义为class a(): def _func(self): return "asdf" # Not sure what to resplace __ ...

  7. python中的类属性和类方法_python面向对象之类属性和类方法的使用和实例

    类属性和类方法 目标 类的结构类属性和实例属性类方法和静态方法 01. 类的结构 1.1 术语 -- 实例 1. 使用面相对象开发,第 1 步 是设计 类 2. 使用 类名() 创建对象,创建对象 的 ...

  8. 【Java 19】反射 - 反射机制概述、获取Class实例、类的加载与ClassLoader的理解、创建运行时类的对象、获取运行时类的完整结构、调用运行时类的指定结构、动态代理

    反射机制概述.获取Class实例.类的加载与ClassLoader的理解.创建运行时类的对象.获取运行时类的完整结构.调用运行时类的指定结构.动态代理 反射 1 Java反射机制概述 1.1 Java ...

  9. java域的控制修饰符可分为_Java中的类和方法的修饰符

    java 中的类和方法的修饰符Java程序在定义类时,除了使用class关键字标识之外,还可以在class之前增加若干类的修饰符来修饰限定所定义的类的特性.类的修饰符分为访问控制符和非访问控制符两大类 ...

最新文章

  1. zabbix系列~ 监控模式
  2. 不挡脸,放肆看!揭秘B站黑科技蒙版弹幕
  3. 业务工作流平台设计(七)
  4. SQL Server 索引使用和优化
  5. 微信小程序怎么新建php文件,微信小程序中创建小程序页面的步骤介绍(图文)...
  6. linux 设备驱动总结,linux设备驱动归纳总结(三):3面向对象思想和lseek
  7. C++新特性探究(十):Lambda
  8. 【书评:Oracle查询优化改写】第三章
  9. 狂人传记:戎马半生 何以安家
  10. 让Docker功能更强大的10个开源工具
  11. cNode------路由设置以及项目基本框架搭建
  12. CPLEX-求解VRPTW模型
  13. 1983年图灵奖--肯尼斯·汤普森和丹尼斯·里奇简介
  14. 基于8086方波锯齿波三角波发生器仿真、基于8086的LCD1602显示仿真设计、基于8086的LED点阵汉字流水显示设计、基于8086的LED中文显示屏显示设计-仿真设计资料【转发】
  15. 区块链与区块链平台的工作流程
  16. 探索人群客单价差异的显著性,使用SPSS就能轻松做到
  17. 【知识】快乐物质:多巴胺和内啡肽(内酚酞)的区别
  18. 自动驾驶的理想破灭?我看到的这些场景都是噩梦 | 分析
  19. linux英汉字典代码,Ubuntu安装英汉词典(词库)详细步骤
  20. Python基础教学5:第一阶段知识复习

热门文章

  1. 基于Java语言构建区块链(一)—— 基本原型
  2. 统计学习方法笔记 -- Boosting方法
  3. struts2中解决下载文件名中文乱码问题
  4. phoenixframework自动化测试平台架构图
  5. Linux5下DHCP配置
  6. ios 如何对UITableView中的内容进行排序
  7. Eclipse小技巧
  8. Sublime text 2/3 中 Package Control 的安装与使用方法
  9. java struts2 表达式语言 ognl 简介
  10. linux shell 判断字符串是否在数组中