Python面向对象
一 简述
什么是面向过程:
面向过程核心是过程二字,过程指的是问题的解决步骤,基于面向过程设计程序就好比设计一条流水线,是一种机械式的思维方式.
优点: 复杂的问题流程化,简单化.
缺点: 可扩展性差.
应用场景: 脚本程序
什么是面向对象:
面向对象核心是对象二字,对象就是特征与技能的结合体,如果把设计程序比喻成创造一个世界,那么程序员就是这个世界的上帝.
优点: 可扩展性强
缺点: 编程复杂度远高于面向过程
应用场景: 需求经常变化的软件,互联网应用,游戏等.
类(class)与对象
类(class)
类即种类,种类,是面向对象程序设计的概念,对象是特征与技能的结合体,而类则是一系列对象相似的特征与技能的结合体.
类是抽象的概念,是完事万物的抽象,是一类食物的共同特征的集合
类的定义
# 定义一个类 class Student: school = '博客园' # 类的数据属性 静态属性 def learn(self): # 类的函数属性 动态属性 print("is learning") # 注: # 类中可以有任意Python代码.这些代码在定义阶段便会执行 # 会产生新的名称空间,用来存放累的变量,与函数名,可以通过Student.__dict__查看 print(Student.__dict__) # 查看类存放的函数名和变量名 print(Student.school) # 打印此变量名 Student.school='abc' # 修改变量 Student.x=1 # 添加参数 del Student.x # 删除参数
对象instance, object
对象是类的具象,是一个实体
对于我们每个人这个个体,都是抽象概念的不同的实体
实例化一个对象
class Student: school = '博客园' def __init__(self,name,age,sex): # 初始化配置 self.name=name self.age=age self.sex=sex def learn(self): print("is learning") # 实例化一个对象 obj1=Student('小明',22,'女') print(obj1.name)
属性查找 & 绑定方法
类有两种属性: 数据属性和函数属性
- 类的数据属性是所有对象共享的
- 类的函数属性是绑定给对象的
class Student: school = '博客园' # 数据属性 def __init__(self,name,age,sex): self.name=name self.age=age self.sex=sex def learn(self): # 函数属性 print("is learning") b1=Student('张胜男',22,'女') b2=Student('林青霞',44,'女') # 数据属性,id一致 print(b1.school,id(b1.school)) print(b2.school,id(b2.school)) # 博客园 2457377493904 # 博客园 2457377493904 # 类的函数属性是绑定给对象使用,obj.method称为绑定方法,内存地址不一致 print(Student.learn) print(b1.learn) print(b2.learn) # <function Student.learn at 0x00000237AAFA71E0> # <bound method Student.learn of <__main__.Student object at 0x00000237AAFA2748>> # <bound method Student.learn of <__main__.Student object at 0x00000237AAFA27B8>>
绑定方法
类中定义的函数是含输的函数属性,类可以使用,但必须遵循函数的参数规则,有几个参数需要传几个参数
类中定义的函数,其实主要是给对象使用,而且是绑定给对象的,虽然所有对象指向的都是相同功能,但是绑定给不同的对象就是不同的绑定方法,
绑定到对象的方法这种自动传值给函数,决定了在类中定义的函数都要默认写一个参数self,self可以是任意名字,但是统一约定了写成self.
绑定到对象的方法的特殊之处在于,绑定给谁就由谁来调用,就会将本身当做第一个参数传给方法.
对象之间交互
class Gaiven: camp = '日本' def __init__(self,nickname,life_value=40,aggresivity=5,): self.nickname = nickname self.life_value = life_value self.aggresivity = aggresivity def attack(self,enemy): enemy.life_value -= self.aggresivity class Riven: camp = '中国' def __init__(self,nickname,life_value=80,aggresivity=100,): self.nickname = nickname self.life_value = life_value self.aggresivity = aggresivity def attack(self,enemy): enemy.life_value -= self.aggresivity # ruiwen shengjingzhi - j1 = Gaiven('二撒子') ri = Riven('天王') print(j1.life_value) ri.attack(j1) print(j1.life_value)
继承 & 派生
简述
继承的功能之一就是解决类与类之间的代码重复的问题
继承是一种创建新类的方式,新建的类可以继承一个或多个父类(python支持多继承),父类又可称为基类或超类,新建的类称为派生类或子类。
子类会“”遗传”父类的属性,从而解决代码重用问题(比如练习7中Garen与Riven类有很多冗余的代码)
继承定义:
class GClass1: # 定义父类 pass class GClass2: # 定义父类 pass class Sbu1(GClass1): # 单继承,基类是GClass1,派生类是Sbu1 pass class Sbu2(GClass1,GClass2): #多继承 pass print(Sbu1.__bases__) print(Sbu2.__bases__) print(GClass1.__bases__) # 执行输出 # (<class '__main__.GClass1'>,) # (<class '__main__.GClass1'>, <class '__main__.GClass2'>) # (<class 'object'>,) # __bases__ 可以查看继承,Python默认继承object
派生
什么是派生?
当然子类也可以添加自己新的属性或者在自己这里重新定义这些属性(不会影响到父类),需要注意的是,一旦重新定义了自己的属性且与父类重名,那么调用新增的属性时,就以自己为准了。
代码如下:
class School: def __init__(self,name,age,sex): self.name = name self.age = age self.sex = sex def eat(self): print("{} 再吃饭!".format(self)) class Student(School): def job(self): print("{} 的工作是学习".format(self.name)) class Teacher(School): def __index__(self,name,age,sex,education): School.__init__(self,name,age,sex) # 调用父类属性 self.education = education # 新属性 def job(self): print("{} 的工作是教书".format(self.name)) # 创建对象 stu1 = Student('王晓',12,'男') tea1 = Teacher('小明',33,'女') # 每个子类都有自己的属性相互不冲突,也是绑定方法 stu1.job() tea1.job()
组合
作者:闫世成
出处:http://cnblogs.com/yanshicheng