`

五Python对象和面向对象(二)

阅读更多

1. 专用类方法

    除了普通的类方法,Python类还可以定义专用方法,专用方法是在特殊情况下或当使用特别语法时由Python替你调用的,而不是在代码中直接调用(像普通的方法那样)。

    专用方法产生的原因:它们提供了一种方法,可以将非方法调用语法映射到方法调用上。

    

#-------------------------------------------------------------------------------
# coding:        utf-8
# Purpose:专用类方法
#
# Author:      zdk
#
# Created:     20/02/2013
# Copyright:   (c) zdk 2013
#-------------------------------------------------------------------------------

class SpecialClassMethod():
    "专用类方法测试"
    def __init__(self):
        self.data={}
    def __setitem__(self,key,value):
        self.data[key]=value
    def __getitem__(self,key=None):
        return self.data[key]

if __name__ == '__main__':
    s = SpecialClassMethod()
    s["key1"]="value1"
    print(s["key1"])   #value1

    (1)__setitem__为一个专用方法,s["key1"]="value1"实际上Python调用了s.__setitem__("key1","value1")。

    (2)__getitem__为一个专用方法,s["key1"]实际上Python调用了s.__getitem__("key1")。

 

2. 高级专用类方法

    __cmp__在比较类实例时被调用。通常,可以通过使用==比较任意两个Python对象,不只是类实例。有一些规则,定义了何时内置数据类型被认为是相等的,你可以定义__cmp__方法,编写自己的比较逻辑,然后你可以使用==来比较你的类,Python将会替你调用你的__cmp__专用方法。

    __len__在调用len(instance)时被调用。

    __delitem__在调用del instance[key]时被调用。

    专用方法意味着任何类可以像字典一样保存键-值对,只要定义了__setitem__方法。任何定义了__cmp__方法的类可以用==进行比较。并且如果你的类表现为拥有类似长度的东西,不要定义GetLength方法,而定义__len__方法,并使用len(instance)。

    Python还有很多其他专用方法,可以参考:http://docs.python.org/2/reference/datamodel.html#specialnames

 

3. 类属性

    我们已经知道了数据属性,它们是被一个特定的类实例所拥有的变量。Python也支持类属性,它们是由类本身所拥有的。

   

class Mp3FileInfo():
    "store mp3 tags"
    tagDataMap = {"title":"take me to your heart",
                "year":"2011/12/12"}

if __name__ == '__main__':
    f = Mp3FileInfo()
    print(f.tagDataMap)           #{'year': '2011/12/12', 'title': 'take me to your heart'}
    print(Mp3FileInfo.tagDataMap) #{'year': '2011/12/12', 'title': 'take me to your heart'}

    (1)tagDataMap是一个类属性:字面的意思,一个类的属性,它在创建任何类实例之前就有效了。

    (2)类属性既既可以通过直接对类的引用,也可以通过对类的任意实例的引用来使用。

    (3)在Python中,只有类属性可以定义在类定义之后,数据属性定义在__init__方法中。  

   

    修改类属性

    f = Mp3FileInfo()
    print(f.tagDataMap)           #{'year': '2011/12/12', 'title': 'take me to your heart'}
    print(Mp3FileInfo.tagDataMap) #{'year': '2011/12/12', 'title': 'take me to your heart'}

    f.tagDataMap={}
    print(f.tagDataMap)             #{}
    print(Mp3FileInfo.tagDataMap)   #{'year': '2011/12/12', 'title': 'take me to your heart'}
    f2=Mp3FileInfo()
    print(f2.tagDataMap) #{'year': '2011/12/12', 'title': 'take me to your heart'}

    Mp3FileInfo.tagDataMap={"title":"take me to your heart"}
    print(f.tagDataMap)             #{}
    print(f2.tagDataMap)            #{'title': 'take me to your heart'}
    print(Mp3FileInfo.tagDataMap)   #{'title': 'take me to your heart'}
    print(Mp3FileInfo().tagDataMap) #{'title': 'take me to your heart'}

    (1)通过实例对类属性进行修改,只会影响到本实例的类属性的值。

    (2)通过类对类属性进行修改,会影响到以后的创建的实例的类属性、通过类引用的类属性和已经创建但没有修改过的实例的类属性的值。

    (3) 通过实例对类属性修改后,其他的任何修改不会影响到此实例类属性的值。

    NOTE:在__init__中可以通过self.__class__.tagDataMap引用类属性。

 

4. 私有函数

    与大多数语言一样,Python也有私有的概念:

        私有函数不可以从它们的模块外面被调用

        私有方法不能从它们的类方面被调用

        私有属性不能从它们的类外面被访问

    与大多数的语言不同,一个Python函数、方法、或属性是私有还是公有,完全取决于它的名字。如果名字已两个下划线开始(但不是结束),它是私有的;其他所有都是公有的。

    如果试图在类外面调用一个私有的方法,Python将引发一个异常,宣传方法不存在。当然它确实存在,但它是私有的,所以在类外是不可使用的。 

    NOTE:在Python中,所有的专用方法(像__setitem__)和内置属性(像__doc__)遵守一个标准的命名习惯:开始结束都是两个下划线。不用对自己的方法和属性用这种方法命名,以免发生混乱。

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    Python 3面向对象编程

    《Python 3面向对象编程》通过Python 的数据结构、语法、设计模式,从简单到复杂,从初级到高级,一步步通过例子来展示了Python 中面向对象的概念和原则。, 《Python 3面向对象编程》不是Python 的入门书籍,适合...

    python面向对象

    python面向对象精彩讲解视频,详细讲解了python在面向对象中的用途。

    python面向对象练习题.pdf

    python面向对象练习题,资料,教育资料

    Python+3面向对象编程.

    《Python 3面向对象编程》通过Python 的数据结构、语法、设计模式,从简单到复杂,从初级到高级,一步步通过例子来展示了Python 中面向对象的概念和原则。, 《Python 3面向对象编程》不是Python 的入门书籍,适合...

    Python3 面向对象编程

    《Python 3面向对象编程》通过Python 的数据结构、语法、设计模式,从简单到复杂,从初级到高级,一步步通过例子来展示了Python 中面向对象的概念和原则。 《Python 3面向对象编程》不是Python 的入门书籍,适合...

    python面向对象课件

    面向对象课件,价值200元,讲的挺详细的,能起到提纲挈领的作用

    Python实验一 面向对象程序设计实验.doc

    Python实验一 面向对象程序设计实验

    Python3面向对象编程

    《Python 3面向对象编程》通过Python 的数据结构、语法、设计模式,从简单到复杂,从初级到高级,一步步通过例子来展示了Python 中面向对象的概念和原则。 《Python 3面向对象编程》不是Python 的入门书籍,适合具有...

    Python面向对象之类和对象实例详解

    本文实例讲述了Python面向对象之类和对象。分享给大家供大家参考,具体如下: 类和对象(1) 对象是什么? 对象=属性(静态)+方法(动态); 属性一般是一个个变量;方法是一个个函数; #类的属性 就是 类变量 #...

    面向对象编程基础_python面向对象_python教程_

    python强大的面向对象能力,让你更好的理解python核心语法

    PYTHON 面向对象编程指南

    Python面向对象编程指南深入介绍Python语言的面向对象特性,全书分3个部分共18章。第1部分讲述用特殊方法实现Python风格的类,分别介绍了__init__()方法、与Python无缝集成—基本特殊方法、属性访问和特性及修饰符、...

    2014年度辛星python面向对象教程

    这是2014年度辛星python的面向对象教程,希望大家能够喜欢。

    Python 面向对象编程

    Python 面向对象编程

    Python中的面向对象(课件)

    详细介绍Python中的面向对象,包括类和对象的概念、类的定义、对象的创建、类中的变量、类中的方法、类的继承、对象的拷贝等,知识点与案例相结合,非常适合高校老师教学和学生课后复习使用。

    Python面向对象编程指南

    Python是一种面向对象、解释型的程序设计语言,它已经被成功应用于科学计算、数据分析以及游戏开发等诸多领域。 Python面向对象编程指南深入介绍Python语言的面向对象特性,全书分3个部分共18章。第1部分讲述用特殊...

    Python 面向对象(进阶篇).pdf

    Python 面向对象(进阶篇).pdf

    python面向对象思维导图

    python面向对象思维导图

Global site tag (gtag.js) - Google Analytics