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中类属性和数据属性的解释相关推荐

  1. python的类属性和方法_Python中类属性、实例属性和实例方法的区别

    你似乎对概念有相当好的理解.很难找到用通用方式解释的信息,尤其是像python这样一种广泛使用的语言.我基本上会附和你的正确假设,并在此过程中做一些小的调整.在 类属性是将从类共享创建的所有对象的特征 ...

  2. python中的类及self详解_Python类class参数self原理解析

    1.self只有在类的方法中才会有,其他函数或方法是不必带self的. 2.在调用时不必传入相应的参数. 3.在类的方法中(如__init__),第一参数永远是self,表示创建的类实例本身,而不是类 ...

  3. python中的类怎么定义怎么用_python中怎么定义一个类

    什么是类? 类用来描述具有相同的属性和方法的对象的集合.它定义了该集合中每个对象所共有的属性和方法.对象是类的实例. 什么是方法? 类中的函数即为方法 如何定义一个类? 定义类,语法格式如下:clas ...

  4. python中的类及self详解_python中的self详解与对照与网站分享

    接触Python以来,看到类里的函数要带个self参数,一直搞不懂啥麻子原因.晚上特别针对Python的self查了一下,理理. Python要self的理由 Python的类的方法和普通的函数有一个 ...

  5. python中的类装饰器应用场景_Python 自定义装饰器使用写法及示例代码

    1.Python装饰器简介 python的装饰器就是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象.简单的说装饰器就是一个用来返回函数 ...

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

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

  7. python定义一个dog类 类属性有名字毛色体重_全面了解python中的类,对象,方法,属性...

    python中一切皆为对象,所谓对象:我自己就是一个对象,我玩的电脑就是对象,坐着的椅子就是对象,家里养的小狗也是一个对象...... 我们通过描述属性(特征)和行为来描述一个对象的.比如家里的小狗, ...

  8. python中的类实例的属性查找过程

    __getattr__.__getattribute__对属性查找的影响 没有__getxxx__的例子 class Book:press = "人民邮电出版社"class Lan ...

  9. python中定义类

    3.2. 定义类 Python是完全面向对象的:可以定义自已的类,从自已的或内置类进行继承,然后对生成的类进行实例化. 在Python中定义类很简单:就象定义函数,没有独立的定义接口.只要定义类,然后 ...

最新文章

  1. Unix下C程序内存泄漏检测工具Valgrind安装与使用
  2. log4j每天,每小时产生一日志文件
  3. 关于win7的64位和32位有什么不同性价比怎么比
  4. .Net5发布在即,当心技术断层!
  5. CI框架--加载静态内容
  6. 想法记录---实时计算的TopN的实现
  7. MUI 如何更改单选框样式
  8. Createprocess控制台程序输出重定向
  9. RxJava 之创建操作符
  10. VMWare 全屏后最小化死机
  11. Java中高级核心知识全面解析——常用框架(SpringMVC-工作原理详解)
  12. 计算机协会换届答辩ppt,国奖答辩PPT-精选版.ppt
  13. 删除idb无法启动 mysql 数据库
  14. SqlDbx连接Mysql中文乱码
  15. “语象观察”-爬取人民日报并统计词频
  16. 【java基础】java继承从“我爸是李刚”讲起
  17. MySQL字符串规则提取
  18. ubuntu16.04安装qq
  19. Appium启动应用时,报错提示adb执行超时的问题解决
  20. 满二叉树与完全二叉树的区别

热门文章

  1. [转]你会做Web上的用户登录功能吗?
  2. poj 1056 IMMEDIATE DECODABILITY
  3. Jquery ui的dialog使用文档概述
  4. php 返回script,从PHP脚本返回JSON
  5. flowable 中文文档_滴滴实习收获 | 产品经理就是写文档和开会沟通的吗?
  6. python上传文件进度_python实现进度条--主要用在上传下载文件
  7. UI设计灵感|信息录入表单页,告别枯燥!
  8. 设计师经常逛的网站?
  9. 经典商务未来科技海报PSD分层模板,以后绝对用得上
  10. 极简主义2020UI设计正流行,欣赏下可临摹的案例模板!