`
bluecrystal
  • 浏览: 267937 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

谈谈python中类属性和类实例的属性的区别

阅读更多

    环境说明:以下python代码均在python2.5下通过。

    最近看到一些人在讨论python中类属性和类的实例的属性,我也来谈谈我个人对这个问题的看法,供pyer参考。

    首先我们来简单的定义一个python的类:

 

# coding: utf-8

class AAA():
    aaa = 10

# 情形1 
obj1 = AAA()
obj2 = AAA() 
print obj1.aaa, obj2.aaa, AAA.aaa 
    
# 情形2
obj1.aaa += 2
print obj1.aaa, obj2.aaa, AAA.aaa 

# 情形3
AAA.aaa += 3
print obj1.aaa, obj2.aaa, AAA.aaa

    在上面的代码,类AAA定义了一个属性aaa,py的类成员变量不像java或者c++那样有访问限定符,像aaa这样的属性定义应该理解为类属性定义,即该定义为所有类AAA的实例所共享,访问该属性,可通过AAA.aaa的方式来访问,是通过类名来引用,但是如果通过类AAA的实例来引用aaa属性,又会是怎样呢,我们来看情形1.

    对于情形1,我相信绝大多数人都会正确的说出结果,那就是:

        10  10  10

    对于上面这个结果,没有任何悬念,通过两个AAA的实例,以及通过AAA类名引用aaa属性值,都是同样的答案。

 

    那在情形2中,应该是什么结果呢,我相信大多数人还是会说出正确的结果:

        12  10  10

    在上面这个结果中,一旦执行了obj1.aaa += 2,也就意味着obj1这个实例有了个实例的属性值,他的属性名称也为aaa,那是不是obj1的aaa是个新的属性呢,实际上可以说法是对,但也不对,实际上obj1.aaa += 2这个代码的执行,并不像我们想象的那么简单,首先他会到obj1所属的类AAA的属性列表中去找一个名称为aaa的属性,如果有,他就会返回该值作为obj1中aaa的初始值,也就是说,这以后obj1.aaa的这个属性值跟AAA.aaa就基本没有关系了。

 

    那在情形3中呢,答案是什么呢:

        12  13  13

    这又怎么说呢,其实很简单,AAA.aaa对AAA类属性做了一次设置,obj1.aaa经过一次+=操作后,实际上与AAA.aaa脱离了关系,而obj2.aaa没有经过任何的属性操作,因此其只会从其所属的类AAA中去获得aaa,并返回。

 

    对于上面的过程,我把代码加上几行,如下:

 

# coding: utf-8

class AAA():
    aaa = 10

obj1 = AAA()
obj2 = AAA()
print obj1.aaa, obj2.aaa, AAA.aaa
print obj1.__dict__, obj2.__dict__, AAA.__dict__

obj1.aaa += 2
print obj1.aaa, obj2.aaa, AAA.aaa 
print obj1.__dict__, obj2.__dict__, AAA.__dict__

AAA.aaa += 3
print obj1.aaa, obj2.aaa, AAA.aaa
print obj1.__dict__, obj2.__dict__, AAA.__dict__

    执行该代码,有如下的结果:

 

10 10 10
{} {} {'__module__': '__main__', 'aaa': 10, '__doc__': None}
12 10 10
{'aaa': 12} {} {'__module__': '__main__', 'aaa': 10, '__doc__': None}
12 13 13
{'aaa': 12} {} {'__module__': '__main__', 'aaa': 13, '__doc__': None}

 

    看了这个结果,我想读者应该明白了,在py中任何东西都是对象,一个类,比如AAA一旦被加载,那么py就会把类AAA也视同为对象,那么AAA的那些实例呢,只会在必要的时候到他这里取一些值去用,这些个实例可都是不同的对象哦,基于这个道理,就很好理解py的这个属性机制了。

 

 

 

分享到:
评论
5 楼 pgt112you 2009-12-15  
赞一个,正好解决了我的疑惑
4 楼 he_lux 2009-11-15  
不错,分析得很好,给我带来了帮助。
3 楼 harry 2008-09-28  
不错,以前没注意到
2 楼 whale 2008-09-18  
最近正在接触python, 可能是以前用惯了java感觉太灵活了,很不习惯。
1 楼 zgwangbo 2008-09-14  
赞一个~~

相关推荐

    谈谈Python:为什么类中的私有属性可以在外部赋值并访问

    - **动态属性**: Python中的一切都是对象,而且是动态类型语言,这意味着在任何时候都可以给任何对象添加新的属性或方法,即使是类的实例也不例外。因此,当我们尝试给`p1.__count`赋值时,实际上是给`p1`这个对象新...

    Python语言中面向对象属性使用方法的探讨.zip

    本讨论将深入探究Python中面向对象属性的使用方法,包括类的定义、对象的创建、属性的访问、属性的封装以及特殊方法如`__init__`和`__getattr__`等。 首先,我们需要了解类(Class)是面向对象编程的基础,它是创建...

    python学习笔记类与模块共10页.pdf.zip

    类是面向对象编程的基本单位,它定义了对象的结构和行为,而模块是代码的容器,用于封装相关的函数、变量和类。类主要用于创建具有特定功能的对象,而模块则是为了代码的组织和复用。 在实际开发中,类通常被定义在...

    python实例

    首先,让我们谈谈Python中的"信号与槽"机制。在多线程或事件驱动编程中,信号和槽是实现组件间通信的重要方式。在Python中,可以使用像`signals`和`slots`这样的库来模拟这种行为,例如`PyQt5`就提供了这样的功能。...

    Python入门

    在学习Python的过程中,我们将通过一系列的实例和练习来掌握基本数据类型的操作,包括如何定义整型、浮点型、布尔型和字符型变量,如何操作列表和元组,如何处理字符串,以及如何使用字典和集合。 总而言之,Python...

    零基础小白的python学习笔记之类和类对象(一)基本定义

    最后,我们来谈谈Python中的多态。多态是指不同的类可以拥有相同的名字的函数,但具体实现可能不同。例如: ```python class A: def fun(self): print('我是A') class B: def fun(self): print('我是B') ``` ...

    Python的对象与型式.zip

    首先,我们来谈谈Python中的“对象”。在Python中,一切皆为对象,这意味着包括数字、字符串、列表、字典、函数甚至类本身都是对象。每个对象都有三个基本特性:身份、类型和值。身份是对象在内存中的唯一标识,可以...

    第1节 - python面向对象基础

    对象是类的实例,每个对象都有其独特的身份,可以拥有类中定义的属性和方法。我们可以通过调用类来创建对象,如: ```python my_object = MyClass("value1", "value2") ``` 这里,`my_object`就是`MyClass`的一个...

    新建文本文档 (7)_Python碰撞检测的数学模型_

    在Python编程领域,碰撞检测是游戏开发、物理模拟和图形渲染等应用中的关键技术。它涉及到如何判断两个或多个对象在空间中是否相交。在这个主题中,我们将深入探讨多父类继承的概念,以及如何利用数学模型实现碰撞...

    Python文字对战游戏.zip

    你可以定义一个`Player`类和`Enemy`类,每个实例都有自己的属性和方法。例如,`Player`类可以有`attack()`和`defend()`方法。 8. 错误处理:使用`try-except`语句捕获和处理可能出现的错误,如用户输入非数字或者...

    python、python匿名函数、文件操作

    首先,我们来谈谈Python中的匿名函数,也称为lambda函数。Lambda函数是一种简化的、单行的、可以创建小型匿名函数的方式。它的基本语法是`lambda arguments: expression`。这里的arguments是函数的参数,expression...

    类与对象的使用实验报告_类与对象的使用_

    实验报告中,你可能会看到更多关于类与对象的实际操作示例,包括如何定义类、创建对象、访问和修改属性、调用方法,以及如何利用继承和多态来增强代码的复用性和灵活性。通过对这些知识点的学习和实践,你将能够更好...

    16-1【SV精通3】类的方法和继承_动态对象_包的使用.zip

    在某些语言中,如Python或JavaScript,对象的属性和方法可以在程序运行过程中动态添加,这为编程带来了极大的灵活性。在Java中,虽然类的结构在编译时是固定的,但对象的实例变量可以在运行时改变,方法也可以通过...

    经典Python面试题之Python基础篇.docx

    Python3 和 Python2 中 int 和 long 的区别? - **Python2**: `int` 表示普通整数,`long` 表示长整数。 - **Python3**: 合并为 `int` 类型,不再区分长整数。 #### 19. xrange 和 range 的区别? - **Python2**...

    978-7-302-52890-6.rar

    首先,让我们谈谈Python的基础知识。Python语法简洁明了,适合初学者快速上手。它的基本数据类型包括整型(int)、浮点型(float)、字符串(str)和布尔型(bool)。变量定义无需提前声明类型,使得代码编写更加...

    Basic_Python_Concepts:解释Python中许多基本概念的问题

    在Python中,类是创建对象的蓝图,包含了数据(属性)和行为(方法)。类定义使用`class`关键字,实例化类则使用圆括号。继承允许一个类(子类)继承另一个类(父类)的属性和方法,从而实现代码复用。多态则是指...

    PyPI 官网下载 | svgbatch-0.1.9.tar.gz

    接下来,我们来谈谈Python库的下载和安装。在命令行中,使用pip工具可以直接从PyPI下载并安装库。然而,对于svgbatch-0.1.9.tar.gz这样的源码包,我们需要先手动下载,然后通过命令行进行解压、编译和安装。具体步骤...

    python中datetime模块中strftime/strptime函数的使用

    在Python的datetime模块中,还有很多其他的属性和方法可以用于日期和时间的处理。像datetime.day, datetime.month, datetime.year等属性分别表示一个datetime对象的日、月、年部分。这些属性可以方便地提取datetime...

    python3 requests库文件上传与下载实现详解

    本文将详细介绍使用Python3的requests库进行文件上传与下载的具体实现方法,并通过实例代码展示其详细的操作步骤,希望能够帮助大家在学习或工作中更好地理解和使用requests库。 首先,我们来谈谈文件上传。在使用...

Global site tag (gtag.js) - Google Analytics