十六、python面向对象基础篇

面向对象基础:

在了解面向对象之前,先了解下变成范式:

编程范式是一类典型的编程风格,是一种方法学

编程范式决定了程序员对程序执行的看法

oop中,程序是一系列对象的相互作用

python支持多种编程范式,面向过程,面向对象,面向切面(装饰器部分)等

--------------------------------------------------------------------

--------------------------------------------------------------------

--------------------------------------------------------------------

OOP思想:

面向对象的基本哲学,世界由具有各自运动规律和内部状态的对象组成,对象之间的相互作用和通讯构成了世界。

唯一性,世界上没有两片相同的树叶,同样的没有两个相同的对象

分类性,分类是对现实世界的抽象

三大特性,继承,多态和封装

老祖宗都是打鱼的,我也是打鱼的 ====》继承

老祖宗用木头插,我用渔网捕鱼 ====》多态

人家找我借100块钱,我从银行拿100块钱给它,被必要告诉它我银行里有多少钱 ======》封装

--------------------------------------------------------------------

--------------------------------------------------------------------

--------------------------------------------------------------------

组织数据的示例:

假如有一个表示门的的数据

门有两个属性,门牌号和打开/关闭的状态

有两个操作符,打开和关闭

--------------------------------------------------------------------

基本组织方式:

#定义两个门和它的门牌号和状态

door1 = [1,‘打开‘]

door2 = [2,‘关闭‘]

#定义函数做打开门的操作

def opened(door)

door[1] = ‘打开‘

#定义函数做关闭门的操作

def closed(door)

door[1] = ‘关闭‘

#这个时候我调用closed函数对door1进行关闭的操作

closed(door1)

print (door1)

--------------------------------------------------------------------

面向对象组织方式(用类来组织):

#使用class关键字声明一个门的类

class Door(object):

a = 100 #这里定义了一个类变量

def __init__(self,num,status):

self.num = num

self.status = status

def opend(self):

self.status = ‘打开‘

def closed(self):

self.status = ‘关闭‘

def __test(self): #这里我定义了一个私有方法

print (‘__test‘)

door1 = Door(1,‘打开‘)

door2 = Door(2,‘关闭‘)

door3 = Door(3,‘打开‘)

door1.__test() #这样会报错,因为它是一个私有成员

door1._Door.__test() #这样就可以了,所以说python中没有真正的私有成员,但是一般没有人会这么用(只是为了测试下这个功能而已)

.......

#现在我想把door3关上

door3.closed()

#现在我想把door2打开

door2.opend()

解析以上语句:

类与实例:

类是一类实例的抽象,抽象的属性和操作,就像上面的Door类

实例是类的具体化,door1 = Door(1,‘打开‘),实例化door1就是一个具体的对象了

为什么我的door3可以直接使用closed()?

因为door3 = Door(3,‘打开‘),是从Door这个类里面实例出来的具体对象,所以类Door里面有的属性,door3就会有

就好像你是一个人,人就一定会有,两条腿,两只眼睛等等,除非你不是人

定义类:

class Door(object):

首字母要大写

object代表继承哪个类,Python2.4之后所有类都要继承自object类,所以最好加上这个。

构造方法:

函数在类里面称为方法,以双下划线__init__开头结束的方法代表是特殊方法

def __init__(self,num,status):

self.num = num

self.status = status

定义一个方法,第一个参数都是self,表示实例本身,调用方法的时候是不需要传递self这个参数的,

解释器会自动的将当前的实例传递给self。如door1 = Door(1,‘打开‘),我们看见我们并不需要传递

self参数,因为self代表的就是door1这个实例本身。

__init__就是python类中的构造方法,实例化类的时候就会调用构造方法door1 = Door(1,‘打开‘)传递的参数就是构造方法所需要的参数。

实例变量:

def __init__(self,num,status):

self.num = num

self.status = status

self.num就是一个实例变量(也可称为实例属性),实例变量一般都在构造方法中定义,但也可以在类的其他方法里面定义(但要尽可能在构造方法中定义实例变量)

实例变量是一个依附于某一个具体的实例的,定义语法为self.argument.

定义实例方法:

def closed(self):

self.status = ‘关闭‘

像这个就是一个实例方法,但是你可以动态的修改实例方法,比如:

def test():

print (‘test‘)

door1.test = test

door1.test()

就像这样我首先定义了一个函数test(),然后我再将这个函数赋值给door1.test,然后我在调用door1.test()就变成了实际执行test()这个函数是一样的效果,这个在c里面是会出问题的

接下来,讲讲类的封装性

私有成员:

*以双下划线开始,不以双下划线结束

*python中其实没有真正的私有成员

私有变量:

self.__status = status

----------------------------------------------------------------------------------------------------------------------------------------------------------------

----------------------------------------------------------------------------------------------------------------------------------------------------------------

------------------------------------------------------------------------------------------------------------------------------------------------------------------

类变量:

*定义在实例方法之外的变量

*所有实例共享类变量,但某一个实例对类变量的修改不会影响其他实例和类本身

*类变量可以直接访问

类方法:

*使用@classmethod装饰器装饰的方法

*第一个参数代表类本身(cls,一定要写,区别实例方法,实例方法的是self)

*类方法可以直接调用

*类方法里可以定义类变量

@classmethod

def test(cls):

cls.b = 200 #cls.b就是一个类变量,cls代表类本身

print "class test"

Door.test() #这里是说类变量可以直接调用

print (Door.b()) #这里直接可以打印出它的类变量

door1.test() #很自然,实例也可以直接访问

静态方法:

*静态方法以@staticmethod装饰器装饰

*静态方法也可以直接调用

*静态方法没有设定第一个参数

@staticmethod

def sta():

print "static method"

Door.sta() #这里是说类变量可以直接调用

door1.sta() #很自然,实例也可以直接访问

类能够调用的方法,实例一定也能调用,因为类比实例高一个级别

而实例能够调用的方法,类就不一定能够直接调用了

属性:

*属性以@property装饰器装饰

*属性的setter方法

*属性的适用场合

定义一个属性,@property装饰器可以使被装饰的方法称为一个属性,就不再是一个方法了,类似于其他语言的get方法,如上面的opend方法

@property

def opened(self):

return self.status == "打开"

作用即是返回某个实例(door1)的状态是“打开”还是“关闭”,如果没有@property的话,就还需要写个if判断语句来,等同于:

def opened(self):

if self.status == "打开":

return True

else:

return False

当一个方法被@property装饰之后,它本身也成了一个装饰器

@opened.setter

def opened(self,value):

if value:

self.status = ‘打开‘

else:

self.status = ‘关闭‘

door1.opend = True

这里这个opend.setter代表我要设置一个条件,如果value为真,我就让它的状态属于“打开”,否则它的状态就为“关闭”,

然后我通过实例的方法door1.opend = True传一个值(True)给value,这个方法很实用,必须掌握,因为这样我们就不用

那么麻烦的还去做判断什么的,可以直接设置一个属性,我用的时候door1.opend = True就是“打开”的状态,door1.opend = False就是关闭的状态。

这里你如果要用就要先@property将某个方法变成一个装饰器,再用@opened.setter来设置它的状态,@property相当于一个get方法,@opened.setter相当于一个set方法,你没有get,哪来set啊。

这两个通常都是成套的,也就是你有get方法就会有set方法,要不然设置不成套。

----------------------------------------------------------------------------------------------------------------------------------------------------------------------

----------------------------------------------------------------------------------------------------------------------------------------------------------------------

----------------------------------------------------------------------------------------------------------------------------------------------------------------------

下边是一个简单的时间类,默认以字符串的形式返回当前的时间,也可以以字符串的形式设置时间,整体来说是封装了私有属性__time

import datetime

class T(object):

def __init__(self):

self.__time = datetime.datetime.now()

@property

def time(self):

return self.__time.strftime(‘%Y-%m-%d %H:%M:%S‘)

@time.setter

def time(self,value):

self.__time = datetime.datetime.strptime(value,‘%Y-%m-%d %H:%M:%S‘)

t = T()

print (t.time)

t.time = ‘2016-12-20 15:30:00‘

print (t.time)

执行之后返回值如下:

>>>

2016-04-29 16:41:04

2016-12-20 15:30:00

在工作中,有些需求需要对IP地址进行处理,因为在计算机中IP都是整数的形式做运算的,但是展现出来的时候都是字符串形式(点分十进制),便于人类查看,就可以使用上述方法实现对IP操作的封装。

原文地址:https://www.cnblogs.com/steven9898/p/11329429.html

时间: 2024-08-26 04:14:01

十六、python面向对象基础篇的相关文章

[python面向对象]--基础篇

1.#类 #类就是一个模板,模板里可以包含多个函数,函数里实现一些功能 #定义一个类 class bar: def foo(self,agr): print(self,agr) obj = bar() print(obj) print(obj.foo("调用类的方法")) 2.#方法 #把函数写在类里就是方法 #构造方法 #普通方法 class person: def __init__(self,name,age): #构造方法的特性,调用 类名() 后,自动执行构造方法 #self

问道python之基础篇【一】 认识python

问道python之基础篇[一] 认识python 1.python的简介 1.1.什么是python? Python是一种面向对象.解释型计算机程序设计语言,由Guido van Rossum于1989年发明,第一个公开发行版发行于1991年. Python语法简洁清晰,特色之一是强制用空白符作为语句缩进. Python具有丰富和强大的库.它常被昵称为胶水语言,能够用其他语言制作的各种模块(尤其是C++)很轻松地联结在一起. 1.2.python的特点 简单,易学,免费.开源,高层语言,移植性,

问道python之基础篇【二】python入门

问道python之基础篇[二] Python入门 1.python的工作过程 python解释器把源代码转换为字节码的中间形式,然后再把它翻译成机器使用的机器语言并运行. 2.pyc文件 2.1.什么是pyc文件 执行python代码时,如果导入了其他的.py文件,那么在执行过程中会自动生成一个与其同名的.pyc文件,该文件就是python解释器编译之后产生的字节码. ps:代码经过编译可以产生字节码:字节码通过反编译也可以得到代码. Pyc文件一般由3个部分组成: 最开始4个字节是一个Maig

Python学习基础篇第一篇——快速入门(适合初学者)

一.Python学习基础篇第一篇--(快速入门) 建议从Python2.7开始学习,Python2.7可以支持扩展大量的第三方类库,是目前比较成熟的版本 编写代码的软件推荐将python自带的IDLE和PyCharm集成IDE结合起来使用 1.1 Python命令行 Python命令行将以 >>> 开始,比如 >>>print 'Hello World!' 对于验证简单的命令可以在python自带的IDLE中完成  1.2 在Python自带的IDLE写一段小程序 在所

【WPF学习】第三十六章 样式基础

原文:[WPF学习]第三十六章 样式基础 前面三章介绍了WPF资源系统,使用资源可在一个地方定义对象而在整个标记中重用他们.尽管可使用资源存储各种对象,但使用资源最常见的原因之一是通过他们的保存样式. 样式是可应用于元素的属性值集合.WPF样式系统与HTML标记中的层叠样式表(Cascading Style Sheet,CSS)标准担当类似的角色.与CSS类似,通过WPF样式可定义通用的格式化特性集合,并且为了保证一致性,在整个应用程序中应用他们.与CSS一样,WPF样式也能够自动工作,指定具体

Python第十八课(面向对象基础)

Python第17课(面向对象基础)    >>>思维导图>>>中二青年 什么是继承? 继承是一种关系,描述两个对象之间,什么是什么的关系 例如麦兜,佩奇,猪刚鬣 都是猪啊, 在程序中,继承描述的是类和类之间的关系 例如a继承了b, a就能直接使用b已经存在的方法和属性 a称之为子类,b称之为父类,也称之为基类 为什么要使用继承 继承的一方可以直接使用被继承一方已经有的东西 其目的是为了重用已经有的代码,提高重用性 如何使用继承 语法 class 类名称(父类的名称):

python 面向对象基础

一.三大编程范式 编程范式即编程的方法论,标识一种编程风格 三大编程范式: 1.面向过程编程 2.函数式编程 3.面向对象编程 二.编程进化论 1.编程最开始就是无组织无结构,从简单控制流中按步写指令 2.从上述的指令中提取重复的代码块或逻辑,组织到一起(比方说,你定义了一个函数),便实现了代码重用,且代码由无结构走向了结构化,创建程序的过程变得更具逻辑性 3.我们定义函数都是独立于函数外定义变量,然后作为参数传递给函数,这意味着:数据与动作是分离的 4.如果我们把数据和动作内嵌到一个结构(函数

python 面向对象 进阶篇

在上篇<python面向对象>中,简单介绍了python中面向对象的基本知识 在这篇博客中,详细介绍python类的成员,成员修饰符,类的特殊成员. 类的成员 类的成员分为三种:字段,方法和属性 所有成员中,只有普通字段的内容保存对象中,即:根据此类创建了多少对象,在内存中就有多少个普通字段.而其他的成员,则都是保存在类中,即:无论对象的多少,在内存中只创建一份. 字段 字段包括普通字段和静态字段.静态字段,保存在类中.普通字段,保存在对象中. class FOO: country = “中国

python面向对象基础

面向对象基础 1. 简述 编程方式: 面向过程: 根据代码在脚本的堆叠顺序,从上到下依次执行 函数式编程:将相同功能的代码封装到函数中,直接调用即可,减少代码重复性 面向对象:对函数进行分类和封装,将同类的函数放到一个类中,使调用更简单 为嘛要面向对象 应用需求 要的对系统的cpu.内存.硬盘等进行监控,超过阈值则告警 while True:    if cpu利用率 > 90%:        #发送邮件提醒        连接邮箱服务器        发送邮件        关闭连接