C++程序员学Python:Python里面的面向对象
python里面也引入了面向对象的方法,除了一些C++的基本概念,还有其他一些不同,例如python的类有时候可以作为一个命名空间
1 class MyData(object): 2 pass
python的继承语法是class class_name(parent_class_name),所以上面的MyData对象继承与object对象,至于object对象,则是python的内置对象,暂且不谈
上面的就是声明了一个空类,但是和C++不同的是,这个类本身可以当作一个命名空间使用,例如:
1 mathObj = MyData() 2 mathObj.x = 4 3 mathObj.y = 5 4 mathObj.x + mathObj.y
这个时候mathObj更多只是作为一个命名空间使用
当我们需要定义一个成员函数的时候:
1 class MyData(object): 2 def printFoo(self): 3 print "you invoked printFoo()" 4 def printFoo2(): 5 print "you invoked printFoo2()"
printFoo2的定义是错误的,调用成员函数printFoo2的时候,解释器会报错,因为他定义形参self,self就是C++里面的this,不过C++在我们定义成员函数的时候,会自动帮我们生成,不用像python这样手动生成(还是我不知道??),我们调用一个成员函数,python和C++也都会自动帮我们传递类对象,所以当我们调用printFoo2的时候,解释器帮我们传递self对象,但是printFoo2并没有定义这个形参
当然,python里面的类也有构造函数和析构函数,与C++不同的是,python的构造函数是__init__,析构函数是__del__
1 class MyData(object): 2 def __init__(self): 3 print "init" 4 def __del__(self): 5 print "del"
1 obj = MyData() 2 init 3 obj = 2 4 del
当我们创建obj的时候,会调用__init__函数,当把obj指向其他的数据的时候,python启动垃圾回收机制,Mydata对象被删除了,同时也调用了__del__函数
python还有一个比较注意的,就是创建类的时候会有一个同名的实例,例如我们有如下的类:
1 class C(object): 2 foo = 100
如果我们输入print C.foo,那么解释器会输出100,如果我们输入C.foo = C.foo+1,那么C.foo会变成101,这时候如果我们b = C(),那么print b.foo会发现输出的是101,这是因为foo在这里实际上是一个静态变量,类似于C++在类里面定义了一个static int foo
但是如果我们的C里面定义了一个function,我们调用C.function()会怎么样,会报错,这点跟foo不同,这个是因为function还没有和一个类去绑定
在C++里面如果我们需要拿到一个类的信息,可以利用typeof,而python里面也有类似的功能,不过需要类继承自object
有如下的:
__name__:类名
__doc__:类的文档
__bases__:所有父类构成的元组
__dict__:类的属性
__module__:类所在的模块
__class__:对应的类