Python基础之面向对象
一、面向对象概述
面向对象编程——Object Oriented Programming,简称OOP,是一种程序设计思想。OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数。
面向过程的程序设计把计算机程序视为一系列的命令集合,即一组函数的顺序执行。为了简化程序设计,面向过程把函数继续切分为子函数,即把大块函数通过切割成小块函数来降低系统的复杂度。
而面向对象的程序设计把计算机程序视为一组对象的集合,而每个对象都可以接收其他对象发过来的消息,并处理这些消息,计算机程序的执行就是一系列消息在各个对象之间传递。
在Python中,所有数据类型都可以视为对象,当然也可以自定义对象。自定义的对象数据类型就是面向对象中的类(Class)的概念。
二、面向对象的三大特性
封装、继承、多态
二、面向对象技术简介
- 类(Class): 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。
- 类变量:类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。类变量通常不作为实例变量使用。
- 数据成员:类变量或者实例变量用于处理类及其实例对象的相关的数据。
- 方法重写:如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重写。
- 实例变量:定义在方法中的变量,只作用于当前实例的类。
- 继承:即一个派生类(derived class)继承基类(base class)的字段和方法。继承也允许把一个派生类的对象作为一个基类对象对待。例如,有这样一个设计:一个Dog类型的对象派生自Animal类,这是模拟"是一个(is-a)"关系(例图,Dog是一个Animal)。
- 实例化:创建一个类的实例,类的具体对象。
- 方法:类中定义的函数。
- 对象:通过类定义的数据结构实例。对象包括两个数据成员(类变量和实例变量)和方法。
三、创建类
使用class语句来创建一个新类,class之后为类的名称并以冒号结尾,如下实例:
class Classname(object): '类帮助信息' class_suite #类体
class
后面紧接着是类名,即Classname,类名通常是大写开头的单词,紧接着是(object)
,表示该类是从哪个类继承下来的,继承的概念我们后面再讲,通常,如果没有合适的继承类,就使用object
类,这是所有类最终都会继承的类。
类的帮助信息可以通过ClassName.__doc__查看。
class_suite 由类成员,方法,数据属性组成。
实例1:
#!/usr/bin/env python # _*_ coding:utf-8 _*_ # Author: enzhi.wang class Employee(object): '所有员工的基类' empcount = 0 def __init__(self,name,salary): self.name = name self.salary = salary Employee.empcount += 1 def displaycount(self): print("Total Employee %d"%Employee.empcount) def displayemployee(self): print("Name :",self.name, "Salary :", self.salary)
- empCount变量是一个类变量,它的值将在这个类的所有实例之间共享。你可以在内部类或外部类使用Employee.empCount访问。
- 注意到
__init__
方法的第一个参数永远是self
,表示创建的实例本身,因此,在__init__
方法内部,就可以把各种属性绑定到self
,因为self
就指向创建的实例本身。有了__init__
方法,在创建实例的时候,就不能传入空的参数了,必须传入与__init__
方法匹配的参数,但self
不需要传,Python解释器自己会把实例变量传进去:
创建实例对象
要创建一个类的实例,你可以使用类的名称,并通过__init__方法接受参数。
# 创建Employee类的第一个对象 emp1 = Employee("Zara",2000) # 创建Employee类的第二个对象 emp2 = Employee("Manni",5000)
访问属性
您可以使用点(.)来访问对象的属性。使用如下类的名称访问类变量:
emp1.displayemployee() emp2.displayemployee() print("Total Employee %d"%Employee.empcount)
完整实例
#!/usr/bin/env python # _*_ coding:utf-8 _*_ # Author: enzhi.wang class Employee(object): '所有员工的基类' empcount = 0 def __init__(self,name,salary): self.name = name self.salary = salary Employee.empcount += 1 def displaycount(self): print("Total Employee %d"%Employee.empcount) def displayemployee(self): print("Name :",self.name, "Salary :", self.salary) # 创建Employee类的第一个对象 emp1 = Employee("Zara",2000) # 创建Employee类的第二个对象 emp2 = Employee("Manni",5000) emp1.displayemployee() emp2.displayemployee() print("Total Employee %d"%Employee.empcount)
执行以上代码输出结果如下:
C:\Python3.5\python.exe C:/Users/root/PycharmProjects/S14/面向对象/test.py Name : Zara Salary : 2000 Name : Manni Salary : 5000 Total Employee 2
你可以添加,删除,修改类的属性,如下所示:
# 添加,删除,修改类属性 emp1.age = 18 #添加一个age属性 emp1.salary = 8888 #修改salary属性 del emp1.age #删除age属性
你也可以使用以下函数的方式来访问属性:
- getattr(obj, name[, default]) : 访问对象的属性。
- hasattr(obj,name) : 检查是否存在一个属性。
- setattr(obj,name,value) : 设置一个属性。如果属性不存在,会创建一个新属性。
- delattr(obj, name) : 删除属性。
print(getattr(emp1,'salary')) # 返回salary的属性值 print(hasattr(emp1,'name')) # 如果存在name属性返回True setattr(emp1,'age',18) # 添加一个属性age,值为18 print(getattr(emp1,'age')) delattr(emp1,'age') # 删除age属性 print(hasattr(emp1,'age'))
self是个什么鬼?
self是python自动会给传值的参数,哪个对象执行方法,self就是谁
emp1 = Employee("Zara",2000) 此时self = emp1
特殊成员
1、__call__使用对象()的形式运行是输出__call__方法
#!/usr/bin/env python # _*_ coding:utf-8 _*_ # Author: enzhi.wang class Foo(object): def __init__(self,name,age): self.name = name self.age = age def __call__(self, *args, **kwargs): print("call") obj1 = Foo("Alex",33) obj1() #对象()方式执行
执行以上代码输出结果如下:
C:\Python3.5\python.exe C:/Users/root/PycharmProjects/S14/面向对象/特殊成员.py call
2、__str__使用print(对象)输出的不在是内存地址而是__str__方法中return的值
#没有使用__str__方法
#!/usr/bin/env python # _*_ coding:utf-8 _*_ # Author: enzhi.wang class Foo(object): def __init__(self,name,age): self.name = name self.age = age obj1 = Foo("Alex",33) print(obj1)
执行以上代码输出结果如下:
C:\Python3.5\python.exe C:/Users/root/PycharmProjects/S14/面向对象/特殊成员.py <__main__.Foo object at 0x0000000000A3B9E8>
# 使用__str__方法
#!/usr/bin/env python # _*_ coding:utf-8 _*_ # Author: enzhi.wang class Foo(object): def __init__(self,name,age): self.name = name self.age = age def __str__(self): return "姓名: %s 年龄: %d"%(self.name,self.age) obj1 = Foo("Alex",33) print(obj1)
执行以上代码输出结果如下:
C:\Python3.5\python.exe C:/Users/root/PycharmProjects/S14/面向对象/特殊成员.py 姓名: Alex 年龄: 33
3、__dict__ 内置方法获取对象中封装的字段,以字典的形式输出
#!/usr/bin/env python # _*_ coding:utf-8 _*_ # Author: enzhi.wang class Foo(object): def __init__(self,name,age): self.name = name self.age = age def __call__(self, *args, **kwargs): print("call") def __str__(self): return "姓名: %s 年龄: %d"%(self.name,self.age) obj1 = Foo("Alex",33) print(obj1.__dict__)
执行以上代码输出结果如下:
C:\Python3.5\python.exe C:/Users/root/PycharmProjects/S14/面向对象/特殊成员.py {'name': 'Alex', 'age': 33}
最新文章
- java Ajax的应用
- soj 2013年 Nanjing Slection
- Jquery 自定义弹窗等待
- V$RMAN_BACKUP_JOB_DETAILS
- BestCoder Round #85 hdu5776 sum
- 带你了解世界最先进的手势识别技术 -- 微软,凌感,Leap...
- 解决sql2008连接数据库,无法为该请求检索数据,错误916
- ve2.0 v-for循环报错的解决方案
- Sql Server 默认值
- Problem A: 平面上的点——Point类 (I)
- MySQL Innodb Engine -- 文件格式(innodb_file_format)
- MySQL ERROR 2005 (HY000)
- http://blog.csdn.net/u011277123/article/details/53665302
- ios中图层和view的关系
- php根据地理坐标获取国家、省份、城市,及周边数据类
- 结对项目作业报告——四则运算web项目
- 互评Alpha版本
- 初识C#设计模式
- okhttp3 ExceptionInInitializerError 异常处理
- 【POJ 2481】 Cows