一、面向过程程序设计与面向对象程序设计
面向过程的程序设计:核心是过程,过程就解决问题的步骤,基于该思想设计程序就像是在设计一条流水线,是一种机械式的思维方式
优点:复杂的问题的简单化,流程化
缺点:扩展性差
面向对象的程序设计:核心是对象,对象是特征(变量)与技能(函数)的结合体,是一种上帝式的思维方式
优点:解决了程序的扩展性
缺点:可控性差
二、类和对象
以游戏举例,基于面向对象设计一个款游戏:英雄联盟,每个玩家选一个英雄,每个英雄都有自己的特征和和技能,特征即数据属性,技能即方法属性,特征与技能的结合体就一个对象。
类:从一组对象中提取相似的部分就是类,类所有对象都具有的特征和技能的结合体
在python中,用变量表示特征,用函数表示技能,因而类是变量与函数的结合体,对象是变量与方法(指向类的函数)的结合体
在现实世界中:对象--(共同的特征与技能)-->类
在程序中:先定义类----(实例化)----->对象
1、类的定义
定义类的语法
class 类名:
'''注释'''
类体
#定义一个学生类:类名通常首字母大写表示
class Student:
school = 'oldboy'
def __init__(self,name,age):
#只用来初始化的,并且一定不能有返回值,
self.name=name
self.age=age
def study(self):
print('is studying')
def fly(self,x):
print(x)
print('%s is flying' %self.name)
def foo(self):
print('===========》')
2、类的作用
类的的用法一:实例化产生对象
类的的用法二:属性引用
3、对象的作用:
对象/实例只有一种作用:属性引用
#类的作用一:实例化对象
s1=Student('egon1',84)
s2=Student('egon2',84)
#类的作用二:类的属性引用
print(Student.school) #引用类的数据属性
print(Student.study) #引用类的函数属性
#对象的用法:属性引用
print(s1.name)
print(s1.age)
对象/实例本身只有数据属性,但是python的class机制会将类的函数绑定到对象上,称为对象的方法,或者叫绑定方法,绑定方法唯一绑定一个对象,同一个类的方法绑定到不同的对象上,属于不同的方法,内存地址都不会一样
4、类的名称空间与对象名称空间
创建一个类就会创建一个类的名称空间,用来存储类中定义的所有名字,这些名字称为类的属性
类有两种属性:数据属性和函数属性,
其中类的数据属性是共享给所有对象的
>>> id(s1.school) #本质就是在引用类的Student属性,二者id一样 4315241024 >>> id(s2.school) 4315241024
而类的函数属性是绑定到所有对象的:
>>> id(s1.study) 4302501512 >>> id(s2.study) 4315244200
创建一个对象/实例就会创建一个对象/实例的名称空间,存放对象/实例的名字,称为对象/实例的属性
在obj.name会先从obj自己的名称空间里找name,找不到则去类中找,类也找不到就找父类...最后都找不到就抛出异常
类属性的补充
一:我们定义的类的属性到底存到哪里了?有两种方式查看 dir(类名):查出的是一个名字列表 类名.__dict__:查出的是一个字典,key为属性名,value为属性值 二:特殊的类属性 类名.__name__# 类的名字(字符串) 类名.__doc__# 类的文档字符串 类名.__base__# 类的第一个父类(在讲继承时会讲) 类名.__bases__# 类所有父类构成的元组(在讲继承时会讲) 类名.__dict__# 类的字典属性 类名.__module__# 类定义所在的模块 类名.__class__# 实例对应的类(仅新式类中)
5、类的成员:
类的成员可以分为三大类:字段、方法和属性
字段
字段包括:普通字段和静态字段,他们在定义和使用中有所区别,而最本质的区别是内存中保存的位置不同,
- 普通字段属于对象
- 静态字段属于类
class Province: # 静态字段 country = '中国' def __init__(self, name): # 普通字段 self.name = name # 直接访问普通字段 obj = Province('河北省') print obj.name # 直接访问静态字段 Province.country 字段的定义和使用