设为首页 收藏本站
查看: 1903|回复: 0

[经验分享] python中类的属性(class attribute&data attribute)的解释

[复制链接]

尚未签到

发表于 2017-5-7 14:49:57 | 显示全部楼层 |阅读模式
python中类的属性(class attribute&data attribute)的解释
2008-01-09  15:56
  着实被"dive into python"和"python简明教程"中对类的属性的介绍弄晕了,在经过了若干小时痛苦的想象和实践后,终于略有小成,写文一篇,帮助大家解惑.
我的环境是python2.5

知识准备

可以看这个连接先:
http://www.python.org/doc/current/tut/node11.html#SECTION0011600000000000000000

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

现象可以概括为:"改变类属性,数据属性跟着变,改变数据属性,类属性不变".其中的原理,因为不明白,所以不乱说了.高人来解释下 :)
对该问题的解释:
http://hi.baidu.com/newtype/blog/item/7dc86d22899b1fa04723e8d0.html
  
希望本文可以给迷糊的朋友以帮助.
  Org: http://hi.baidu.com/newtype/blog/item/03b355fb626071126c22eb1a.html

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-374308-1-1.html 上篇帖子: python 实现當前文件夾下的批量文件的content replace 下篇帖子: python开发环境的搭建(两分钟内应该解决的困惑)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表