环境说明:以下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的这个属性机制了。
分享到:
相关推荐
python中类属性和实例属性名字冲突怎么办共3页.pdf.zip
本文实例讲述了Python面向对象之类和对象。分享给大家供大家参考,具体如下: 类和对象(1) 对象是什么? 对象=属性(静态)+方法(动态); 属性一般是一个个变量;方法是一个个函数; #类的属性 就是 类变量 #...
本文实例讲述了Python 类属性与实例属性,类对象与实例对象用法。分享给大家供大家参考,具体如下: demo.py(类属性,所有实例对象共用类属性): # 定义工具类 继承object是为了兼容python2.x class Tool...
Python入门经典实例Python入门经典实例Python入门经典实例Python入门经典实例Python入门经典实例Python入门经典实例Python入门经典实例Python入门经典实例Python入门经典实例Python入门经典实例Python入门经典实例...
类属性和实例属性 #coding:utf-8 class Student(object): name = 'I am a class variable' #类变量 >>> s = Student() # 创建实例s >>> print(s.name) # 打印name属性,因为实例并没有name属性,所以会继续查找...
目录类属性属性的定义操作类属性的三种方法属性存在的意义操作类属性的方法使用@property装饰器操作类属性通过@property装饰器对属性的取值和赋值加以控制使用python内置函数操作属性。 类属性 属性的定义 python中...
使用环境:需要先安装PyCharm(请自己百度下载安装),以及然后官网上下载Python 2.7版本,以及Python 3.7版本后,安装在自己的电脑上。...目的:帮助理解类对象和实例对象概念在Python中的具体使用。
python基础训练题,类和方法的概念和实例 类(Class):用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。 方法:类中定义的函数。 类的构造方法__init__():...
PYTHON学习教程资源:实例属性和类属性代码.docx
主要介绍了Python类属性与实例属性用法,实例分析了Python类属性与实例属性的功能、定义与使用技巧,需要的朋友可以参考下
类的实例化问题解决 运行结果: line 21, in <module> s=speaker('ken',10,'aaa') TypeError: __init__() missing 1 required positional argument: 'h... 您可能感兴趣的文章:Python面向对象程序设计中类的定义、实
在Java中我们可以通过反射来根据类名创建类实例,那么在Python我们怎么实现类似功能呢?其实在Python有一个builtin函数import,我们可以使用这个函数来在运行时动态加载一些模块
本文实例讲述了Python操作Oracle数据库的简单方法和封装类。分享给大家供大家参考,具体如下: 最近工作有接触到Oracle,发现很多地方用Python脚本去做的话,应该会方便很多,所以就想先学习下Python操作Oracle的...
>>> class Person(object): address = 'Earth' #类的属性直接在类内部定义,当实例属性和类属性重名时,实例属性优先级⾼ def __init__(self, name): self.name = name >>> Person.address #直接通过类.属性可以访问 ...
python读取CAD的扩展属性,并展示在界面上,python二次开发CAD扩展属性,pyqt5设计界面,cass扩展属性的提取,里面包含源代码及打包好exe。
粗糙集属性约简代码python
变量名定义的变量称之为实例属性或者实例变量 在类中且在函数体内部以变量名=变量值的形式定义的变量称之为局部变量 二 类属性 class Person: name = '小张', age = 24 类属性的特点是所有实例化的对象都共享...
最近在学习python,纯粹是自己的兴趣爱好,然而并没有系统地看python编程书籍,觉得上面描述过于繁琐,在网站找了一些学习的网站,下面这篇文章主要给大家介绍了关于python中类和实例时如何绑定属性与方法的相关资料...
一般来说,在Python中,类实例属性的访问规则算是比较直观的。 但是,仍然存在一些不是很直观的地方,特别是对C++和Java程序员来说,更是如此。 在这里,我们需要明白以下几个地方: 1.Python是一门动态语言,任何...
ARCGIS中Python实现按属性字段批量掩膜提取,保存数据集名称为字段中的属性值。