三大特征
1.封装
封装机制将数据和代码捆绑到一起,避免了外界的干扰和不确定性。它同样允许创建对象。简单的说,一个对象就是一个封装了数据和操作这些数据的代码的逻辑实体。在一个对象内部,某些代码和(或)某些数据可以是私有的,不能被外界访问。通过这种方式,对象对内部数据提供了不同级别的保护,以防止程序中无关的部分意外的改变或错误的使用了对象的私有部分。
封装的作用主要有以下4点:
①.隐藏数据信息,避免恶意修改带来的安全问题
②.封装之后可以供多处调用,减少程序的耦合度
③.类内部的结构可以自由更改而不会影响其他代码
④.能够对成员属性进行精准的控制
2.继承
继承,指可以让某个类型的对象获得另一个类型的对象的属性的方法。它支持按级分类的概念。继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。 通过继承创建的新类称为“子类”,被继承的类称为“父类”。继承的过程,就是从一般到特殊的过程。要实现继承,可以通过 “继承”和“组合”来实现。继承概念的实现方式有二类:实现继承与接口继承。实现继承是指直接使用父类的属性和方法而无需额外编码的能力;接口继承是指仅使用属性和方法的名称、但是子类必须提供实现的能力。
继承的作用主要有以下3点:
①.实现代码复用,避免代码冗余
②.代码结构层次清晰
③.为了实现多态
3.多态
所谓多态就是对一个实例的相同方法在不同的情形下有不同的表现形式。多态机制使得不同内部结构的对象可以共享相同的外部接口,这就意味着,虽然不同的类的内部操作不同,但可以通过一个公共的类,它们可以通过相同的方式予以调用。例如当我们说这是一只在飞着的鸟的时候。其实我们也可以说成:这是一只在飞着的飞行物(鸟的父类)。
魔法方法 / 属性
在python中,有的名称会在前面和后面加上两个下划线,由这些名字组成的集合所包含的方法称为魔法方法(或者是特殊方法)。如果对象实现了这些方法中的某一个,那么这个方法会在特殊的情况下(确切地说是根据名字)被python调用。而几乎没有直接调用它们的必要。
这里会详细讨论一些重要的魔法方法(最重要的是__init__方法和一些处理对象访问的方法,这些方法允许你创建自己的序列或者是映射),还会处理属性(通过property函数来处理)。
一. 构造方法
1.1 介绍与创建
首先要讨论的第一个魔法方法是构造方法,它代表着类似于以前例子中使用过的那种名为init的初始化方法。但构造方法和其他普通方法不同的地方在于,当一个对象被创建后,会立即调用构造方法。
在python中创建一个构造方法只要将init方法的名字从简单的init修改为魔法版本__init__即可:
'''
class Person
def__init__(self,):
'''
如果给构造方法传几个参数的话,要怎么做呢:
'''
class Person:
def__init__(self,name):
self.name = name
因为参数是可选的,所以你可以继续,当做什么事情都没发生:
1.2 重写一般方法和特殊的构造方法
重写是继承机制中的一个重要内容,对于构造方法尤其重要。构造方法用来初始化新创建对象的状态,大多数子类不仅要拥有自己的初始化代码,还要拥有超类的初始化代码。当一个类的构造方法被重写,那么就需要调用超类的构造方法,否则对象可能不会被正确地初始化。
'''
class Bird:
def__init__(self):
self.hungry = True
def eat(self):
if self.hungry:
print"Aaaah..." self.hungry = False
else:
print'No,thanks'class SongBird(Bird):
def__init__(self):
self.sound ='Squark!'def sing(self):
printself.sound
'''
下面介绍2种重写构造函数的方法:调用超类构造方法的未绑定版本,或者使用super函数。
(1)调用父类构造方法的未绑定版本
'''
class SongBird(Bird):
def__init__(self):
Bird.__init__(self)
self.sound ='Squark!'def sing(self):
printself.sound
'''
在调用一个实例的方法时,该方法的self参数会被自动绑定到实例上。但是如果直接调用类的方法,那么就没有实例会被绑定。这样就可以自由第提供需要的self参数。这样的方法称为未绑定方法。
通过将当前的实例作为self参数提供给未绑定方法,SongBird就能使用其超类构造方法的所有实现,也就是说属性hungry能被设置。
(2)使用super函数
如果读者不想坚守旧版python阵营的话,那么就应该使用super函数。当前的类和对象都可以作为super函数的参数使用,调用函数返回的对象的任何方法都是调用超类的方法,而不是当前类的方法。可以直接使用super(SongBird,self)。
'''
class SongBird(Bird):
def__init__(self):
super(SongBird,self).__init__()
self.sound ='Squark!'def sing(self):
printself.sound
'''