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__:对应的类

原文地址:https://www.cnblogs.com/linyilong3/p/2952826.html