Python中的Class

尽管 Python 在 Function Programming 中有着其他语言难以企及的的优势,但是我们也不要忘了 Python 也是一门 OO 语言哦。因此我们关注 Python 在 FP 上的优势的同时,还得了解一下 Python 在 OO 方面的特性。
要讨论 Python 的 OO 特性,了解 Python 中的 Class 自然是首当其冲了。在 Python 中定义 class 和创建对象实例都很简单,具体代码如下:

 1 class GrandPa:
 2     def __init__(self):
 3         print('I\'m GrandPa')
 4 
 5 
 6 class Father(GrandPa):
 7     def __init__(self):
 8         print('I\'m Father!')
 9 
10 class Son(Father):
11     """A simple example class"""
12     i = 12345
13     def __init__(self):
14         print('这是构造函数,son')
15     def sayHello(self):
16         return 'hello world'
17 
18 if __name__ == '__main__':
19     son = Son()
20     # 类型帮助信息 
21     print('类型帮助信息: ',Son.__doc__)
22     #类型名称
23     print('类型名称:',Son.__name__)
24     #类型所继承的基类
25     print('类型所继承的基类:',Son.__bases__)
26     #类型字典
27     print('类型字典:',Son.__dict__)
28     #类型所在模块
29     print('类型所在模块:',Son.__module__)
30     #实例类型
31     print('实例类型:',Son().__class__)

运行情况:

Python 3.3.2 (v3.3.2:d047928ae3f6, May 16 2013, 00:03:43) [MSC v.1600 32 bit (Intel)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> ================================ RESTART ================================
>>> 
这是构造函数,son
类型帮助信息:  A simple example class
类型名称: Son
类型所继承的基类: (<class '__main__.Father'>,)
类型字典: {'__module__': '__main__', 'sayHello': <function Son.sayHello at 0x010194F8>, '__doc__': 'A simple example class', '__init__': <function Son.__init__ at 0x010194B0>, 'i': 12345}
类型所在模块: __main__
这是构造函数,son
实例类型: <class '__main__.Son'>
>>> 
#Python 支持多重继承

首先第一点,你会发现 Class 的定义中有一个括号,这是体现继承的地方。 Java 用 extends,C#、C++ 用冒号 (:),Python 则用括号了。从括号中包含着两个值,聪明的你一定可以发现:Python 支持多重继承;

#__init__ 是 Class 中的构造函数

第二点,__init__ 是 Class 中的构造函数,两种不同形式的构造函数体现了 Python 支持函数重载。在构造函数中,有一个特别的参数 self,其含义与我们在 Java 和 C# 中常见的 this 是一样的。在这里需要强调一点:在 Class 中定义的方法实质上也是 function,但是在方法定义的时候必须包含 self 这个参数,而且必须将 self 这个参数放在第一位;

#python 成员变量

第三点,在 Python 中,你并不需要显式的声明 Class 的 Data Members,而是在赋值的时候,被赋值的变量就相应成为了 Class 的 Data Memebers,正如代码中的 x 和 y。不仅你不需要显式的声明 Data Members,更加特别的,你甚至可以通过 del 方法将 Class 中的 Data Memebers 给删掉。当我第一次看到这样的特性的时候,着实吃了一惊。毕竟 OO 的第一条就是封装了,但是这样的特性是不是破坏了封装的特性呢?

#python 方法二义性问题

第四点,由于 Python 支持多重继承,因此就有可能出现方法二义性问题 [1]。然而由于 Python 遵循深度优先的搜寻法则,很好地避免了方法二义性的问题。例如在以上的代码中,MyClass 同时继承于 BaseClassA 和 BaseClassB,假设 MyClass 调用一个叫 derivedMethod 方法,derivedMethod 同时定义在 BaseClassA 和 BaseClassB 中,且 Signature 也完全相同,那么 BaseClassA 中的方法将被调用。如果 BaseClassA 中并没有定义 derivedMethod,而是 BaseClassA 的父类定义了这个方法的话,将会是 BaseClassA 的父类中 derivedMethod 被调用。总之,继承方法搜索的路径是先从左到右,在选定了一个 BaseClass 之后,将会一直沿着该 BaseClass 的继承结构进行搜索,直至最顶端,然后再到另外一个一个 BaseClass。

就先说着这么多了,对于 Python 中 OO 的特性将会在以后的 Post 中有进一步的讲述。

[1] 方法二义性:由于一个类同时继承于两个或者多个父类,而在这些父类当中存在着 signature 完全相同的方法,那么编译器将无法判断子类将继承哪个父类中的方法,从而导致方法二义性问题。

原文:http://www.cnblogs.com/perhaps/archive/2005/08/25/223005.html

 

========================================================

More reading,and english is important.

I'm Hongten

 

大哥哥大姐姐,觉得有用打赏点哦!多多少少没关系,一分也是对我的支持和鼓励。谢谢。
Hongten 博客排名在 100 名以内。粉丝过千。
Hongten 出品,必是精品。

E | hongtenzone@foxmail.com  B | http://www.cnblogs.com/hongten

========================================================