面向对象基础
面向对象基础
####**面向过程编程** 面向过程又被称为top-down languages。 基本设计思路就是程序一开始是要着手解决一个大的问题,然后把一个大问题分解成很多个小问题或子过程,这些子过程再执行的过程再继续分解直到小问题足够简单到可以在一个小步骤范围内解决。
面向对象编程
Object Oriented Programming,简称OOP,是一种程序设计思想。OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数。
面向对象的程序设计把计算机程序视为一组对象的集合,而每个对象都可以接收其他对象发过来的消息,并处理这些消息,计算机程序的执行就是一系列消息在各个对象之间传递。
面向对象的特性
- class 类
一个类即是对一类拥有相同属性的对象的抽象、蓝图、原型。在类中定义了这些对象的都具备的属性(variables(data))、共同的方法。
class Student (object):#定义student 类
pass
- Object 对象
一个对象即是一个类的实例化后实例,一个类必须经过实例化后方可在程序中调用,一个类可以实例化多个对象,每个对象亦可以有不同的属性,就像人类是指所有人,每个人是指具体的对象,人与人之前有共性,亦有不同。
stu = Student() #实例化
print (stu)
____________________________________________
>>>:<__main__.student object at 0x1021434e0>
- Encapsulation 封装
-
在类中对数据的赋值、内部调用对外部用户是透明的,这使类变成了一个胶囊或容器,里面包含着类的数据和方法
-
防止数据被随意修改。
-
使外部程序不需要关注对象内部构造,只需要通过此对象对外提供的接口进行直接访问即可。
-
class Student(object):
def __init__(self,name,score):#属性,成员变量
self.name = name
self.score = score
def print_score(self): #方法,动态属性
print('%s:%s'%(self.name,self.score))
stu = Student('zhangsan','59')
stu.print_score()
________________________________________________
>>>:'zhangsan:59'
注意到__init__方法的第一个参数永远是self,表示创建的实例本身,因此,在__init__方法内部,就可以把各种属性绑定到self,因为self就指向创建的实例本身。
有了__init__方法,在创建实例的时候,就不能传入空的参数了,必须传入与__init__方法匹配的参数,但self不需要传,Python解释器自己会把实例变量传进去
-
继承
-
它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。
-
新的class称为子类(Subclass),而被继承的class称为基类、父类或超类(Base class、Super class)。
-
在某些 OOP语言中,一个子类可以继承多个基类。但是一般情况下,一个子类只能有一个基类,要实现多重继承,可以通过多级继承来实现。
-
继承概念的实现方式主要有2类:实现继承、接口继承。
实现继承是指使用基类的属性和方法而无需额外编码的能力
接口继承是指仅使用属性和方法的名称、但是子类必须提供实现的能力(子类重构爹类方法);
OO开发范式大致为:划分对象→抽象类→将类组织成为层次化结构(继承和合成) →用类与实例进行设计和实现几个阶段。
-
class School(object):
def __init__(self,name,age,course,role):
self.name = name
self.age = age
self.course = course
self.role = role
def print_info(self):
print('name:%s,role:%s,age:%s'%(self.name,self.role,self.age))
def tell(self):
print('School says hello')
class Teacher(School):
def __init__(self,name,age,course,role,salary):
super(Teacher,self).__init__(name,age,course,role) #继承
self.salary = salary
self.print_info()
def tell(self): #接口继承
print('i am a teacher,i am teaching')
def teaching(self):
print('i am teaching %s'%self.course)
class Student(School):
def __init__(self,name,age,course,role,money):
super(Student,self).__init__(name,age,course,role)
self.money=money
self.print_info()
def tell(self):
print('i am a student,i have payed %s for %s'%(self.money,self.course))
t1 = Teacher('zhangsan','28','python','teacher','2000')
s1 = Student('lisi','10','python','student','15000')
t1.tell()
t1.teaching()
s1.tell()
_____________________________________________________
>>>:name:zhangsan,role:teacher,age:28
>>>:name:lisi,role:student,age:10
>>>:i am a teacher
>>>:i am teaching python
>>>:i am a student,i have payed 15000 for python
- 多态
-
多态是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。
-
那么,多态的作用是什么呢?我们知道,封装可以隐藏实现细节,使得代码模块化;继承可以扩展已存在的代码模块(类);它们的目的都是为了——代码重用。而多态则是为了实现另一个目的——接口重用!多态的作用,就是为了类在继承和派生的时候,保证使用“家谱”中任一类的实例的某一属性时的正确调用。
-
class Animal(object):
def __init__(self,name):
self.name =name
def talk(self):
print('animal is talking')
class Cat(Animal):
def talk(self):
print('cat %s is talking'%self.name)
class Dog(Animal):
def talk(self):
print('dog %s is talking'%self.name)
def talk(obj): #一个接口,多种形态
obj.talk()
c1 = Cat('tom')
d1 = Dog('jerry')
talk(c1)
talk(d1)
____________________________________________
>>>:cat tom is talking
>>>:dog jerry is talking