先看几个例子,C++码农可能会觉得不可思议:
一:对象与实例是两种不同的类型
class A:pass
a1=A()
a2=A()
print type(a1)==type(a2) #True
print type(a1)==type(A) #False
二:可以在类之外为类增加成员和成员函数
import sys
class A:pass
a=A()
A.data="hello world"
A.output=lambda self:sys.stdout.write(self.data+"\n")
a.output() #输出:hello world
三:可以通过对象调用/改变成员,但不一定会影响实例
class A: a=8
a1=A()
a2=A()
print A.a,a1.a,a2.a #8,8,8
A.a=7
print A.a,a1.a,a2.a #7,7,7
a1.a=6
print A.a,a1.a,a2.a #7,6,7
A.a=5
print A.a,a1.a,a2.a #5,6,5
四:不能通过参数的数量,类型或返回值重载函数(或成员函数)
class A:
def func(self):pass
def func(self,arg):pass #此时第一个func已经被覆盖,甚至被回收了
a=A()
a.func(6) #ok
a.func() #Err
五:python类的实现机制:
python的类实质上只是一个命名空间,更具体地说,只是一个普通的字典, 对象字典中包含各个成员和成员函数, 实例开始时仅是一个空字典,通过__class__指向对象,对象再通过__bases__指向基类,每次调用只是依次对实例字典,对象字典,父类字典进行搜索, 仅此而已.
思考:python是解释性语言,没有编译的过程,包括类,函数,成员函数等各种概念并没有限定(也无法限定)格式, 仅仅是规定了如何去运行,例如类成员函数的运行方式:1,取首参数,2(如果有)取其余参数 3,依次运行函数在的语句 , 至于能否运行成功python并不关心(不成功就报错呗). 而且python没有隐藏实现的细节,类似于__class__这种实现层面的对象都可以随意修改, 因此python可以完成许多C++做不到的事, 但最好还是不要这样,否则马上你就会发现自己代码跟一坨翔一样自己都看不懂了