Class 类
一个类即是对一类拥有相同属性的对象的抽象、蓝图、原型。在类中定义了这些对象的都具备的属性(variables(data))、共同的方法
Object 对象
一个对象即是一个类的实例化后实例,一个类必须经过实例化后方可在程序中调用,一个类可以实例化多个对象,每个对象亦可以有不同的属性,就像人类是指所有人,每个人是指具体的对象,人与人之前有共性,亦有不同
Encapsulation 封装
在类中对数据的赋值、内部调用对外部用户是透明的,这使类变成了一个胶囊或容器,里面包含着类的数据和方法
Inheritance 继承
一个类可以派生出子类,在这个父类里定义的属性、方法自动被子类继承
class Role( object ): #定义一个类, class是定义类的语法,Role是类名,(object)是新式类的写法,必须这样写,以后再讲为什么 def __init__( self ,name,role,weapon,life_value = 100 ,money = 15000 ): #初始化函数,在生成一个角色时要初始化的一些属性就填写在这里 self .name = name #__init__中的第一个参数self,和这里的self都 是什么意思? 看下面解释 self .role = role #实例变量,(静态属性)作用域;实例本身 self .weapon = weapon self .life_value = life_value self .money = money |
1
2
|
r1 = Role( 'Alex' , 'police' ,'AK47’) #生成一个角色 , 会自动把参数传给Role下面的__init__(...)方法 r2 = Role( 'Jack' , 'terrorist' ,'B22’) #生成一个角色 |
我们看到,上面的创建角色时,我们并没有给__init__传值,程序也没未报错,是因为,类在调用它自己的__init__(…)时自己帮你给self参数赋值了,
1
2
|
r1 = Role( 'Alex' , 'police' , 'AK47’) #此时self 相当于 r1 , Role(r1,' Alex ',' police ',' AK47’) r2 = Role( 'Jack' , 'terrorist' , 'B22’)#此时self 相当于 r2, Role(r2,' Jack ',' terrorist ',' B22’) |
- 在内存中开辟一块空间指向r1这个变量名
- 调用Role这个类并执行其中的__init__(…)方法,相当于Role.__init__(r1,'Alex','police',’AK47’),这么做是为什么呢? 是为了把'Alex','police',’AK47’这3个值跟刚开辟的r1关联起来,是为了把'Alex','police',’AK47’这3个值跟刚开辟的r1关联起来,是为了把'Alex','police',’AK47’这3个值跟刚开辟的r1关联起来,重要的事情说3次, 因为关联起来后,你就可以直接r1.name, r1.weapon 这样来调用啦。所以,为实现这种关联,在调用__init__方法时,就必须把r1这个变量也传进去,否则__init__不知道要把那3个参数跟谁关联呀。
- 明白了么哥?所以这个__init__(…)方法里的,self.name = name , self.role = role 等等的意思就是要把这几个值 存到r1的内存空间里。
1
2
|
def buy_gun( self ,gun_name): #类的方法,功能(动态属性) print (“ % s has just bought % s” % ( self .name,gun_name) ) |
1
2
|
r1 = Role( 'Alex' , 'police' , 'AK47' ) r1.buy_gun( "B21”) #python 会自动帮你转成 Role.buy_gun(r1,”B21" ) |
- 上面的这个r1 = Role('Alex','police','AK47’)动作,叫做类的“实例化”, 就是把一个虚拟的抽象的类,通过这个动作,变成了一个具体的对象了, 这个对象就叫做实例
- 刚才定义的这个类体现了面向对象的第一个基本特性,封装,其实就是使用构造方法将内容封装到某个具体对象中,然后通过对象直接或者self间接获取被封装的内容
面向对象的特性:
封装
封装最好理解了。封装是面向对象的特征之一,是对象和类概念的主要特性。
封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。
继承
面向对象编程 (OOP) 语言的一个主要功能就是“继承”。继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。
通过继承创建的新类称为“子类”或“派生类”。
被继承的类称为“基类”、“父类”或“超类”。
继承的过程,就是从一般到特殊的过程。
类变量和实例变量区别?
类变量是类里面的变量,即使不实例化也可以调用
类变量;大家公用的属性,节省内存
实例变量是实例化对象里面 __init__ 里的变量,
若是类变量和实例变量的名称一致,则会优先调用实例变量
析构函数:在实例释放,销毁对的时候执行的(程序结束或者执行del之后;删除 实例之后执行的),通常用于做一些收尾工作,如关闭数据库的链接,打开临时的文件
不是在外部调用的,不需要传参数,是在实例释放后自动执行的
def __del(self):
私有属性;私有方法
私有属相是在属相名前加两个下划线;私有方法也是
私有属性在外部不可调用,但是可以在内部进行调用
私有方法同私有属性
继承
def sleep(self): 对父类方法进行添加新的功能
People.sleep(self)(调用父类的方法)
print('sleep 5')
另一种继承;新式类的写法
python支持多继承
继承时构造函数的查找顺序
1 若Relation类没有构造函数,则会去查找People的构造函数
若是都有构造函数则优先查找左边的构造函数
2多类继承
多数情况下深度效率不如广度效率高
3 多态
那么,多态的作用是什么呢?我们知道,封装可以隐藏实现细节,使得代码模块化;继承可以扩展已存在的代码模块(类);它们的目的都是为了——代码重用。而多态则是为了实现另一个目的——接口重用!多态的作用,就是为了类在继承和派生的时候,保证使用“家谱”中任一类的实例的某一属性时的正确调用。