Python简明教程第7节:面向对象(一)
第六步尚未完成,先看第七步好了。
面向对象
面向对象是一种编程思想,是相对于面向过程而言的。
简单来说,面向对象的编程思想其实一种懒人思想,什么都不做,什么都交给对象做。既然什么都要交给对象做,你起码需要一个对象嘛,那么你要在茫茫人海中寻找那个能帮你做事的人么,还是确定下特征来缩小范围比较好,比如你需要的这个对象:25岁左右,女性,短发,会做饭,会暖床……满足这些条件的也一定很多,你找到其中一个就行了,然后让她帮你做事情就好了。
上面的过程,其实大概就包含了面向对象的思想,抽象,实例化之类的内容……也就是大概,可能不太准确。这种思想需要慢慢领悟。
相关概念
类:用来描述一个具有相同的属性和方法的对象的集合。
对象:通过类定义的数据结构实例。对象包括两种数据成员(类变量和实例变量)和方法。
类变量:类变量在整个实例化的所有对象中是公用的。类变量定义在类中且在函数体之外。类变量通常不作为实例变量使用。
实例变量:定义在方法中的变量,只作用于当前实例。
实例化:创建一个类的实例,类的具体是一个对象。
Person类:
![](https://img.haomeiwen.com/i9552257/a45c8b7c30f2039a.png)
关于类和对象的最基本内容大概就是上图展示的这些,下面逐一讲解:
创建类
class ClassName:
类体 #由类变量,方法,实例变量组成
tips:
我们可以通过内置类属性查看类的相关信息
__dict__ : 类的属性,以字典形式显示,由类的数据属性组成
__doc__ :类的文档字符串
__name__: 类名
__module__: 类定义所在的模块
__bases__ : 类的所有父类(元组) 这里涉及到继承,后面再说。
![](https://img.haomeiwen.com/i9552257/ccc8614cc7e083f3.png)
创建对象
类的实例化类似函数调用。
p = Person("liyisi", 20, "male")
tips:
访问属性用“ . ”来完成,例如 p.name p._age
你甚至可以添加,删除类的属性。p.school = "peking unibersity" 这样就添加了一个属性 del p.school 就可以删除该属性了。
添加和删除类的属性还可以使用下面的方法来实现:
setattr(obj,name,value) : 设置一个属性。如果属性不存在,会创建一个新属性。delattr(obj, name) : 删除属性。
除此之外:
getattr(obj, name[, default]) : 访问对象的属性。hasattr(obj,name) : 检查是否存在一个属性。
![](https://img.haomeiwen.com/i9552257/cd73664d6894ab08.png)
对象销毁
Python 使用了引用计数这一简单技术来跟踪和回收垃圾。
其实对象的销毁也对应着一个方法:
def __del__(self):
class_name = self.__class__.__name__
print (class_name, "销毁")
![](https://img.haomeiwen.com/i9552257/d94b8f86d8cfcbd3.png)
![](https://img.haomeiwen.com/i9552257/eb2ad148ea340785.png)
当一个对象被创建之后, 就创建了一个引用计数, 当这个对象不再需要时, 也就是说, 这个对象的引用计数变为0 时, 它被垃圾回收。但是回收不是"立即"的, 由解释器在适当的时机,将垃圾对象占用的内存空间回收。
垃圾回收机制不仅针对引用计数为0的对象,同样也可以处理循环引用的情况。循环引用指的是,两个对象相互引用,但是没有其他变量引用他们。这种情况下,仅使用引用计数是不够的。Python 的垃圾收集器实际上是一个引用计数器和一个循环垃圾收集器。作为引用计数的补充, 垃圾收集器也会留心被分配的总量很大(及未通过引用计数销毁的那些)的对象。 在这种情况下, 解释器会暂停下来, 试图清理所有未引用的循环。
在了解了对象创建和销毁的相关概念之后,我们说一哈继承。
继承
相对于面向过程而言,面向对象的编程带来的主要好处之一就是代码的重用,实现这种重用的方法之一是通过继承机制。继承完全可以理解成类之间的类型和子类型关系。继承的语法如下:
class className ( BaseClass ):
class_suite
![](https://img.haomeiwen.com/i9552257/1f6aa12a417150cc.png)
关于上面的实例,我们看到在子类中并没有定义getAttr()等方法,但是我们却可以使用之类的实例来调用这些方法,这就是继承给我们带来的便利。由于子类继承了父类,就相当于在子类中也定义了父类的属性和方法。这就是代码的重用。
多继承
像 C++ 一样,python 支持多继承,和单继承具有相似的格式,只是父类有多个。
class className(Base1, Base2, Base3):
class_suite
继承的好处之一就是要重用父类中的属性和方法,那么在多继承的时候,如果多个父类中具有相同的属性和方法又当如何呢?
此时,python 给出的解决方法是,按照继承顺序搜索,也就是从左往右匹配得到需要的内容。
方法重写
有的时候父类方法的功能不能很好地满足我们对程序的需求,这个时候,我们可以对父类的方法进行重写,使之符合我们的需求。如下:
![](https://img.haomeiwen.com/i9552257/337f7d3e164abacd.png)
![](https://img.haomeiwen.com/i9552257/1927393c5d5d091a.png)
可以看到的是,在子类和父类中都有一个myMethod()方法且有不同的实现,我们在使用之类调用的时候执行的是子类重写后的方法,而不再是父类的方法。
在python中继承中的一些特点:
1.可以多继承,就是说一个子类可以有多个父类。
2.父类中构造需要手动调用
Then,that’s all,thank you。