Python学习系列之Object and Object-Orientation

来源:互联网 发布:无线mesh网络qos 编辑:程序博客网 时间:2024/06/03 14:04
Object and Object-Orientation
   1. Python中,引入一个module/unction的方法有两种,其格式为:
         import module
         from module import item
        这两种方法其本相同,其不同之处在于from module import item这种方式直接将item引入到当前的namespace,这样一来用户便可直接引用item而不需要透过module name来引用。那么,什么情况下使用哪种方法好呢?一般来说,你想偷偷懒,不想多敲键盘,就用from module import item好啦,这样你便可以直接引用;如果你只想引入module的一些attributes 和function,你也可以使用这种方式;但是如果用户自己的module和待引入的module会存在名字冲突,则需要使用import module这用格式。
2.定义类
       在Python中,定义类是简单的,格式如下
        class ClassName(ParentClass)
              pass
        其中pass用于占位,类似于Java和C中的{}。Python中的类也有类似于C++中构造函数的东东,即__init__。此外,类还有类似于module和function的doc strings
例如,
        class FileInfo(UserDict):
                 “store file metadata”
                  def __init__(self, filename = None):
UserDict.__init__(self)
Self[“name”] = filename
        值得一提的是,类中的每一个函数,包括__init__,self必须作为其第一个参数。当调用父类的函数时,必须包含self参数。当从外部调用类的函数时,不需要指定self参数。__init__并不是必须的,但是如果定义了__init__函数,必须记得调用其父类的__init__函数。
3.类的实例化
       在Python中,类的实例化直接调用类来完成,就像调用函数一样。传入的参数跟__init__中定义一致。返回值便是一个对象。例如:
import fileinfo
f = fileinfo.FileInfo(“D://Python24//Script//test.txt”)
f.__class__
f.__doc__
f
         类的创建简单,注销更简单,通常不需要刻意的desctroying。实例会根据其作用范围,自动注销。内存泄漏在Python中是十分少见的。Python使用一种叫reference counting的技术,当一个实例的reference counting为0,该实例便会被注销。
 4.一个具体类的说明:
在Python的安装路径下,lib中有一个叫UserDict的模块,以其为实例来说说类 的创建、使用吧!
(1)    类的定义:
                  class UserDict:
                           def __init__(self, dict = None):
                                  self.data = {
                                  if dict is not None: self.update(dict)
 
        Python中并没有重载的概念,不同的function需要不同的name,不能像C++/Java那样可以实现重载。子类中的__init__函数甚至会覆盖父类的__init__函数。
(2)    函数的定义
def clear(self) : self.data.clear()
def copy(self) :
if self.__class__ is UserDict:
        return UserDict(self.data)
import copy
return copy.copy(self)
def keys(self) : return self.data.keys()
def items(self): return self.data.items()
def values(self): return self.data.values()
 
一些Function也可以直接从内建的数据类型dict来得到。
                    class FileInfo(dict):
                      “store file metadata”
                      def __init__(self, filename = None):
                            self[“name”] = filename
   (3) 一些特别的函数定义
   不同于一般函数,特殊的函数不仅是可以直接调用,它还可能被Python在特定的环境下调用。例如__getitme__和__setitem__
    def __getitem__(self, key): return self.data[key]
     def __setitem__(self, key, item): self.data[key] = item
  这些特殊的函数可以在其子类中改写。例如,在FileInfo的子类Mp3FileInfo中改写__setitem__。
   def __setitem__(self, key, item):
          if key == “name” and item:
                self.__parse(item)
          FileInfo.__setitme__(self, key, item)
 (4) Python中还有一些特殊的函数,如下所示:
           def __repr__(self) : return repr(self.data)
    def __cmp__(self, dict):
             if isinstance(dict, UserDict):
                 return cmp(self.data, dict.data)
             else:
                 return cmp(self.data, dict)
     def __len__(self): return len(self.data)
     def __delitem__(self, key): del self.data[key]
 (5) 不同于Java/C++,Python中一个函数是private还是public完全由其名字来决定。如果名字是以__开头,则为private function。