• python中类的属性(class attribute)的解释


    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)
    看下面的例子

    [python] view plaincopy
     
    1. class Test:  
    2.     pass  
    3.   
    4. t=Test()  
    5. t.name='notus'  
    6. print t.name   

    我们在类Test中并没有定义name这个数据属性,但是在代码中却可以直接使用,这就是数据属性.

    方法
    这个暂且不议.

    如何定义类的属性

    现在,抛开广义上对属性attribute的解释,在实际编程中经常用的属性这个词,在python的class中有两种属性:类属性,数据属性.(大多数编程语言都有这样两种属性).类属性属于类,数据属性属于类的实例.我们假设有类Test,则一般这两种属性的用法是

    [python] view plaincopy
     
    1. Test.mode  
    2. t=Test()  
    3. t.name  

    那么这两种属性应该在什么时候定义呢?
    按照上面的讨论可知,数据属性不需要预先定义,当数据属性初次被使用时,它即被创建并赋值.而实际上,类属性也是如此.

    因此,我们有了下面的例子

    [python] view plaincopy
     
    1. class Test:  
    2.     pass  
    3.   
    4. t=Test()  
    5. t.name='notus'  
    6. print t.name  
    7. Test.mode='auto'  
    8. print Test.mode  

    大家看,数据属性name和类属性mode均没有在类中被定义,你要做的,只是在需要的时候使用他们即可.

    如何预先给属性赋值

    可以在类的定义中使用属性,先看这个例子

    [python] view plaincopy
     
    1. class Test:  
    2.     def ask(theInstance):  
    3.         theInstance.name='notus'  
    4.         Test.mode='auto'  
    5.   
    6. ##print Test.mode  
    7. t=Test()  
    8. ##print t.name  
    9. t.ask()  
    10. print Test.mode  
    11. print t.name  

    类Test有方法ask.注意看程序中被注释掉的两行,在没有使用ask()方法前,运行被注释的那两句的任一句均会出错,提示"class Test has no attribute ...".但运行ask()后,我们在ask()方法中初始了这两个属性,则运行通过.
    注意看ask()接收的参数theInstance,这个传过来的就是程序中类Test的实例t.一般的命名规范建议将这个参数命名为self.这个参数是python自动传入的,所以不需要再在程序中传.
    如果想要在类实例化后立刻使用这些属性,那就应该把这些属性的初始放在__init__()方法中,前面说过了,__init__()方法在类的实例化结束后立刻被自动调用.所以我们的例子程序可以改成这样

    [python] view plaincopy
     
    1. class Test:  
    2.     def __init__(self):  
    3.         self.name='notus'  
    4.         Test.mode='auto'  
    5.   
    6. ##print Test.mode  
    7. t=Test()  
    8. ##print t.name  
    9. print Test.mode  
    10. print t.name  

    所以可以有这样的类定义

    [python] view plaincopy
     
    1. class Test:  
    2.     def __init__(self):  
    3.         self.name='notus'  
    4.         Test.mode='auto'  
    5.     def ask(self):  
    6.         self.date='2008'  
    7.   
    8. ##print Test.mode  
    9. t=Test()  
    10. ##print t.name  
    11. print Test.mode  
    12. print t.name  
    13. ##print t.date  
    14. t.ask()  
    15. print t.date  

    数据属性date只有在调用了ask()方法后才可以被使用.当然这样也可以使用这个属性

    [python] view plaincopy
     
    1. ##print Test.mode  
    2. t=Test()  
    3. ##print t.name  
    4. print Test.mode  
    5. print t.name  
    6. t.date='2007'  
    7. print t.date  

    在程序中创建了date这个数据属性.可以想象,之后调用ask()方法时,数据属性date已经存在,只是被改变了值.

    不用方法也可以初始化属性

    看下面的示例程序

    [python] view plaincopy
     
    1. class Test:  
    2.     action='win the game'  
    3.   
    4. print Test.action  
    5. t=Test()  
    6. print t.action  
    7. Test.action='at least 1 point'  
    8. print Test.action  
    9. print t.action  
    10. t.action='dont lose'  
    11. print Test.action  
    12. print t.action  

    运行的结果如下

    win the game
    win the game
    at least 1 point
    at least 1 point
    at least 1 point
    dont lose

    现象可以概括为:"改变类属性,数据属性跟着变,改变数据属性,类属性不变".其中的原理,因为不明白,所以不乱说了.高人来解释下 :)

  • 相关阅读:
    一些常看的网站 工具
    JavaScript 学习
    我的周记15——“5年后,你想成为怎样的人”
    一点分享:从日课到晨记
    跟着高淇学Python——第一到第三章总结
    在新的电脑上的Git本地库 与远程库关联前的一些设置
    搭建环境
    查询XML树
    Linq to XML的基本操作
    LINQ to XML概述
  • 原文地址:https://www.cnblogs.com/jackhub/p/3607811.html
Copyright © 2020-2023  润新知