python中类属性和数据属性的解释
python中的类叫class object,类的实例叫instance object.
类 Class Objects
类拥有两种操作,1.类属性 attribute references 2.实例化instantiation
类属性就相当于专属于一个类的变量(即某些语言中的类的静态公共变量static public),使用方法是:类名称.类属性名称 实例化则是创建一个类的实例的方法,使用方法是:类名称()
在使用实例化方法后,将会创建一个空的类实例,一般的python类的定义中会有一个特殊的方法来初始化,这个方法就是__init__(),当调用了类的实例化方法后,__init__()方法会立刻被这个类的实例调用.也就是说,__init__()不是构造函数,而是一个普通的方法. 类的实例 Instance Objects
类的实例只拥有一种操作,这就是 1.属性调用 attribute references.
属性调用指 1.数据属性 2.方法
数据属性不需要预先定义!当数据属性初次被使用时,它即被创建并赋值(they spring into existence when they are first assigned to) 看下面的例子
class Test:
pass
t=Test()
t.name='notus'
print t.name
我们在类Test中并没有定义name这个数据属性,但是在代码中却可以直接使用,这就是数据属性. 现在,抛开广义上对属性attribute的解释,在实际编程中经常用的属性这个词,在python的class中有两种属性:类属性,数据属性.(大多数编程语言都有这样两种属性).类属性属于类,数据属性属于类的实例.我们假设有类Test,则一般这两种属性的用法是
Test.mode
t=Test()
t.name
那么这两种属性应该在什么时候定义呢?
按照上面的讨论可知,数据属性不需要预先定义,当数据属性初次被使用时,它即被创建并赋值.而实际上,类属性也是如此.
因此,我们有了下面的例子
class Test:
pass
t=Test()
t.name='notus'
print t.name
Test.mode='auto'
print Test.mode
大家看,数据属性name和类属性mode均没有在类中被定义,你要做的,只是在需要的时候使用他们即可.如何预先给属性赋值
可以在类的定义中使用属性,先看这个例子
class Test:
def ask(theInstance):
theInstance.name='notus'
Test.mode='auto'
##print Test.mode
t=Test()
##print t.name
t.ask()
print Test.mode
print t.name
类Test有方法ask.注意看程序中被注释掉的两行,在没有使用ask()方法前,运行被注释的那两句的任一句均会出错,提示"class Test has no attribute ...".但运行ask()后,我们在ask()方法中初始了这两个属性 ,则运行通过.
注意看ask()接收的参数theInstance,这个传过来的就是程序中类Test的实例t .一般的命名规范建议将这个参数命名为self.这个参数是python自动传入的,所以不需要再在程序中传.
如果想要在类实例化后立刻使用这些属性,那就应该把这些属性的初始放在__init__()方法中,前面说过了,__init__()方法在类的实例化结束后立刻被自动调用. 所以我们的例子程序可以改成这样
class Test:
def __init__(self):
self.name='notus'
Test.mode='auto'
##print Test.mode
t=Test()
##print t.name
print Test.mode
print t.name
所以可以有这样的类定义
class Test:
def __init__(self):
self.name='notus'
Test.mode='auto'
def ask(self):
self.date='2008'
##print Test.mode
t=Test()
##print t.name
print Test.mode
print t.name
##print t.date
t.ask()
print t.date
数据属性date只有在调用了ask()方法后才可以被使用.当然这样也可以使用这个属性
##print Test.mode
t=Test()
##print t.name
print Test.mode
print t.name
t.date='2007'
print t.date
在程序中创建了date这个数据属性.可以想象,之后调用ask()方法时,数据属性date已经存在,只是被改变了值. 不用方法也可以初始化属性
看下面的示例程序
class Test:
action='win the game' #类属性
print Test.action
t=Test()
print t.action
Test.action='at least 1 point'
print Test.action
print t.action
t.action='dont lose'
print Test.action
print t.action
运行的结果如下
win the game
win the game
at least 1 point
at least 1 point
at least 1 point
dont lose
现象可以概括为:"改变类属性,数据属性跟着变,改变数据属性,类属性不变".
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
引用
对于情形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,并返回。
引用
《python核心编程》
如果尝试在实例中设定或更新类属性会创建一个实例属性 c.version,后者会阻止对类属性
C.versioin 的访问,因为第一个访问的就是 c.version,这样可以对实例有效地“遮蔽”类属性C.version,直到 c.version 被清除掉。
python中类属性和数据属性的解释的更多相关文章
- Python中类属性和实例属性的区别
在Python中经常会混淆类属性和实例属性的概念,今天专门记录一下个人理解以免日后忘记. 看下面的例子: class Tencent(): i = 10 # 此处i为类属性 def __init__( ...
- python 类属性和实例属性
class AAA(): aaa = 10 # 情形1 obj1 = AAA() obj2 = AAA() print obj1.aaa, obj2.aaa, AAA.aaa # 情形2 obj1.a ...
- 关于Python类属性与实例属性的讨论
标题名字有点长. 之所以想写这个文章是因为碰巧看到网上一篇关于Pyhon中类属性及实例属性区别的帖子.因为我之前也被这个问题困扰过,今天碰巧看到了这篇帖子,发现帖子的作者只是描述了现象,然后对原因的解 ...
- python中类中属性和方法的具体定义方法和使用
1. Python中类中特性分成属性和方法 属性和方法都分为私有和公有的,私有的只可以在本类中使用外部是无法访问的 2. 定义属性(成员变量)的语法格式(公有属性/私有属性) class 类名: de ...
- Python中类的属性的访问控制
因为自己是做.NET的,之前有学习过Python,喜欢这门语言的很多特性,最近又不时看了一会儿,将自己的感受分享给大家,其中也难免会用C#的角度看Python的语法,主要还是讲下Python中类中对属 ...
- python 3 属性查找与绑定方法
1.属性查找 类有两种属性:数据属性和函数属性 (1)类的数据属性是所有对象共享的 #类的数据属性是所有对象共享的,id都一样 class OldboyStudent: school='oldboy' ...
- Python——特殊属性与方法
Python 对象 中以双下划线开头和结尾的属性称为特殊属性,由于对象的方法也属于属性,因此以双下划线开头和结尾的方法称为特殊方法.对这些对象执行一些特定的运算时,Python会自动视图调用这些实例的 ...
- python中类的定义、实例化、封装以及私有变量/方法
1. 定义类 python中定义一个类的格式如下: class MyClass(object): def __init__(self,data1,data2): self.__data1=data1 ...
- python中self与__init__怎么解释能让小白弄懂?
python中self与__init__怎么解释能让小白弄懂? 这个问题其实没那么简单. 只说一下自己的理解. python 里所有的 object 都有三个属性, 标识(identity), 类型( ...
随机推荐
- 使用python制作大数据词云
1 from wordcloud import WordCloud 2 import PIL.Image as image 3 import numpy as np 4 import jieba 5 ...
- docker之镜像配置
以管理员sudo执行以下命令 docker ps -a 查看镜像的id docker exec -it 镜像id /bin/bash -i表示交互模式 -t表示启动容器进入命令行 加入这两参数,容器创 ...
- 「HTML+CSS」--自定义加载动画【014】【疑问未解决】
前言 Hello!小伙伴! 首先非常感谢您阅读海轰的文章,倘若文中有错误的地方,欢迎您指出- 哈哈 自我介绍一下 昵称:海轰 标签:程序猿一只|C++选手|学生 简介:因C语言结识编程,随后转入计算机 ...
- 【CTF】XCTF Misc 心仪的公司 & 就在其中 writeup
前言 这两题都是Misc中数据包的题目,一直觉得对数据包比较陌生,不知道怎么处理. 这里放两道题的wp,第一题strings命令秒杀觉得非常优秀,另外一题有涉及RSA加密与解密(本文不具体讨论RSA非 ...
- C++ new和delete运算符得简单使用
NEW C++ 中的new运算符用来分配内存,和c语言中得malloc有相似得功能. 使用new为当个元素开辟内存空间,并返回地址 typeName *pointer_name =new typeNa ...
- 浅入Kubernetes(8):外网访问集群
目录 查询 Service Service 外部服务类型 配置 ServiceType 伸缩数量 阶段总结 在前面几篇文章中,我们学习了 kubeadm .kubectl 的一些命令,也学会了 Dep ...
- sharedWorker 实现多页面通信
是这样的,今天玩github,先是在没有登录浏览了一些页面,然后在某一页面进行了登录.这时再切换的其他页面时就看到了下面的提示: 那么这是怎么做到的呢?我们可以想到,一种办法是 localStorag ...
- ELK安装和配置及常用插件安装
环境 CentOS 7.3 root 用户 JDK 版本:1.8(最低要求),主推:JDK 1.8.0_121 以上 关闭 firewall systemctl stop firewalld.serv ...
- Mybatis(一)Porxy动态代理和sql解析替换
JDK常用核心原理 概述 在 Mybatis 中,常用的作用就是讲数据库中的表的字段映射为对象的属性,在进入Mybatis之前,原生的 JDBC 有几个步骤:导入 JDBC 驱动包,通过 Driver ...
- 1.1.08- Python变量的关联,绑定,引用
Python中关联.绑定,引用的含义: 在Python中,变量没有类型 关联/绑定/引用都是指变量和一个对象的关联关系. 在交互模式下查看变量的绑定关系: >>>help(" ...