当前位置: 首页 > 编程日记 > 正文

Python之类

1、类的结构
1.使用面向对象开发,第一步是设计类
2.使用 类名() 创建对象,创建对象的动作有两步
    1.在内存中为对象分配空间
    2.调用初始化方法__init___ 为对象初始化
3.对象创建后,内存中就有了一个对象的实实在在的存在--实例

因此:
1.创建出来的对象叫做类的实例
2.创建对象的动作叫做实例化
3.对象的属性叫做实例属性
4.对象调用的方法叫做实例方法

在程序执行时:
1.对象各自拥有自己的实例属性
2.调用对象的方法,可以通过self
    访问自己的属性
    调用自己的方法
结论:
1.每一个对象都有自己独立的内存空间,保存各自不同的属性
2.多个对象的方法,在内存中之有一份,在调用方法时,需要把对象的引用传递到方法内部

2、类属性
Python: 一切皆对象
类是一个特殊的对象---类对象
在程序运行的时候,类对象(创建实例对象的模板)在内存中只有
一份,通过它可以创建出和很多个对象实例
除了封装实例的属性和方法外,类对象还可以拥有自己的属性和方法
1.类属性
2.类方法

通过 类名. 的方式可以直接访问类的属性

类属性:就是给类对象定义的属性
       通常用来记录与这个类相关的特征
       类属性不会用于记录具以的对象特征
定义一个工具类,每个工具都有自己的名字
需要知道使用这个类,创建了多少个工具对象

例:

class Tool(object):# 1.使用赋值语句定义类属性,记录所有工具的数量count = 0def __init__(self, name):self.name = name# 让类属性+1Tool.count += 1
# 创建工具对象
tool1 = Tool('斧头')
tool2 = Tool('榔头')# 输出工具对象的总数
# 使用类名.属性名来获取
print Tool.count

3.类方法:

类属性就是针对类对象定义的使用赋值语句在class关键字下可以定义类属性类属性用于记录于这个类相关的特性
类方法就是针对类对象定义的方法在类方法内部就可以直接访问类属性或者调用其他类方法
例:
class Toy(object):# 使用赋值语句定义类属性,记录所有玩具的数量count = 0@classmethoddef show_toy_count(cls):# cls.count 在类方法内部,访问当前的类属性print '玩具对象的数量 %d' % cls.countdef __init__(self, name):self.name = name# 让类属性+1Toy.count += 1#创建玩具对象
toy1 = Toy('乐高')
toy2 = Toy('玩具熊')#调用类方法
Toy.show_toy_count()

4.静态方法在开发的时候,如果需要在类中封装一个方法,这个方法即不需要访问实例属性或者调用实例方法也不需要访问类属性或者调用类方法这个时候,我们就可以把这个方法封装成一个静态方法
例:
class Cat(object):# 不访问实例属性/类属性@staticmethoddef call():print '喵喵~'
# 通过 类名. 调用静态方法
Cat.call()
# 不需要创建对象,直接就可以使用

总结:
1.实例方法--方法内部需要访问实例属性
    实例方法内部可以使用 类名. 访问类属性
2.类方法:方法内部“只”需要访问类属性
3.静态方法:方法内部,不需要访问实例属性和类属性

提问:
如果方法内部 即需要访问实例属性,又需要访问类属性,应该定义什么方法?
答案:
应该定义实例方法,因为类只有一个,在实例方法内部可以使用类名,访问类属性

单例:设计模式:

设计模式是前人的总结和经验的提炼,通常,被人人们广为流传的设计模式都是针对某一特定问题的成熟解决方案

单例设计模式

单例:让类创建的对象,在系统中有唯一的实例

创建对象的时候:

1.为对象分配空间:__new__()

创建对象的时候,python解释器首先会调用__new__方法为ie对象分配空间

__new__是一个由object基类提供的内置的静态方法,主要有两个作用:

在内存中为对象分配空间

返回对象的引用

2.对象初始化 :__init__()

python解释器获得对象的引用后,将引用的第一个参数,传递给__init__方法

例:

class MusicPlyer(object):def __new__(cls, *args, **kwargs):# 第一个参数cls:哪一个类调用就传递哪一个类# 第二个参数*args:是一个多值元组参数# 第三个参数**kwargs:是一个多值的字典参数# 1.创建对象时,new方法会被自动调用print '创建对象,分配空间' # 重写了父类的方法#2.为对象分配空间# __new__方法是一个静态方法,在调用的时候,第一个参数是clsinstance = object.__new__(cls)# 3.返回对象的引用return instancedef __init__(self):print '初始化播放器'
# 创建播放器对象
player1 = MusicPlyer()
print player1
player2  =MusicPlyer()
print player2


总结:

重写__new__方法的代码非常固定:
    继承自父类方法
    返回父类方法调用_new__方法的结果
重写__new__方法一定要return object.__new__(cls)
否则python的解释器得不到分配了空间的对象引用,就不会调用对象的初始化方法

"""
"""
python中的单例:
单例:让类创建的对象,在系统中只有唯一的一个实例
        1.定义一个类属性,初始值时None,用于记录单例对象的引用(因为当一个类定义完成运行程序的时候,
        内存中有这个类创建的对象么?
并没有,我们需要调用创建对象的方法,内存中才会有第一个对象)
        2.重写__new__方法
        3.如果类属性is None,调用父类方法分配空间,并在类属性中记录结果
        4.返回类属性中记录的对象引用


程序执行时,只执行一次初始化工作
在每次使用 类名() 创建对象时,python的解释器都会自动调用两个方法
    __new__ 分配空间
    __init__ 对象初始化
但在上一小结中 __new__方法改造之后,每次都会得到第一次被创建对象的引用
但是:初始化方法还会被再次掉用

需求:让初始化方法只执行一次
解决办法:
1.定义一个类属性init_flag标记是否执行过初始化动作,初始值为false
2.在__init__方法中,判断init_flag,如果为false就执行初始化动作
3.然后将init_flag设置为trun
4.这样,再次自动调用__init__方法时,初始化动作就不会再次被执行了

例:

class MusicPlayer(object):# 记录第一个被创建对象的应用instance = Noneinit_flag = Falsedef __new__(cls, *args, **kwargs):# 判断类属性是否为空(如果是空对象,说明第一个对象还没被创建)if cls.instance is None:# 调用父类的方法,为第一个对象分配空间cls.instance = object.__new__(cls)# 返回类属性保存的对象引用return cls.instancedef __init__(self):# 1.判断是否执行过初始化方法if MusicPlayer.init_flag:return# 2.如果没有执行,执行初始化动作print '初始化播放器'# 3.修改类属性的标记MusicPlayer.init_flag = True# 创建多个对象
player1 = MusicPlayer()
print player1
player2 = MusicPlayer()
print player2


1、异常:

什么是异常?
程序在运行的时候,如果python解释器遇到一个错误,会停止程序的执行,
并且提示一些错误的信息,这就是异常

怎样避免这种情况的发生?
我们在程序开发的时候,很难将所有的特殊情况都处理,通过异常捕获可以针对
突发事件做集中处理,从而保证程序的健壮性和稳定性

需要执行的步骤是什么?

在程序开发中,如果对某些代码的执行不能确定(程序语法完全正确)
可以增加try来捕获异常
try:
    尝试执行的代码
except:
    出现错误的处理

例如:

正常情况下:

num = int(raw_input('请输入一个整数:'))print '请输入正确的整数'print '*' * 50

增加try后捕获异常

try:# 不能确定正确执行的代码num = int(raw_input('请输入一个整数:'))
except:print '请输入正确的整数'print '*' * 50

2、根据错误类型捕获异常

需求:
    1.提示用户输入一个整数
    2.使用8除以用户输入的整数并输出
根据错误类型来捕获异常
try:
    尝试执行的代码
except 错误类型1:
    针对错误类型1,对应的代码处理
except 错误类型2:
    针对错误类型2,对应的代码处理

try:# 提示用户输入一个整数num = int(raw_input('输入一个整数:'))# 使用8除以整数并且输出result = 8 / numprint result
except ZeroDivisionError:print '0不能做除数'
except ValueError:print '输入的值不是数字'
"""
1.0不能做除数
2.输入的值不是数字
"""
print '* ' * 50

3、根据报错来写try:

try:num = int(raw_input('输入一个整数:'))# 使用8除以整数并且输出result = 8 / numprint result
except ZeroDivisionError:print '0不能做除数'
except ValueError:print '输入的值不是数字'
# 没有预先判断到的错误,但是如果出现,我们也不希望程序意外停止
finally:# 无论是否有异常,都会执行的代码print '祝您使用愉快'

4、没有预先判断到的错误,但是如果出现,我们也不希望程序意外停止
try:
    # 提示用户输入一个整数
    num = int(raw_input('输入一个整数:'))

# 使用8除以整数并且输出
    result = 8 / num
    print result
except ZeroDivisionError:
    print '0不能做除数'
except Exception as result:
    print '未知错误 %s' % result
finally:
    # 无论是否有异常,都会执行的代码
    print '祝您适用愉快!!'

异常的传递:

def demo1():return int(raw_input('输入整数:'))def demo2():return demo1()print demo2()

通过查看报错信息,可以知道

函数的错误是一级一级的去找,最终会将异常传递到主程序print demo2()里面

解决问题:

保证程序的正常运行

def demo1():return int(raw_input('输入整数:'))def demo2():return demo1()
try:print demo2()
except Exception as result:print '未知错误 %s' % result
print '*'*20

5、主动抛出异常

需求 :

提示用户输入密码,如果长度小于8,就抛出异常

def input_passwd():# 1.提示用户输入密码pwd = raw_input('请输入密码:')# 2.判断密码的长度 >=8,返回用户的密码if len(pwd) >= 8:return pwd# 3.如果<8 主动抛出异常print '主动抛出异常'# 1.创建异常对象ex = Exception('密码长度不够')# 2.主动抛出异常raise ex
# 注意:只抛出异常而不捕获异常,代码会出错
try:print input_passwd()
except Exception as result:print result

6、断言

可以理解为提前预言,让人更好的知道错误的原因

def func(num, div):assert (div != 0), 'div不能为0'return num / divprint func(10, 0)

相关文章:

祝大家圣诞节快乐!

在圣诞节来临之际&#xff0c;分享这份网页的代码&#xff0c;祝愿大家圣诞节快乐&#xff01;点击这里查看效果 以下是源代码&#xff0c;可以保存到html文件打开看效果&#xff1a; 1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "ht…

【iOS官方文档翻译】UICollectionView与UICollectionViewFlowLayout

&#xff08;一&#xff09;先来简单回顾一下UICollectionView *UICollectionView的简单使用可以看我以前写的这篇博文&#xff1a;UICollectionView的基本使用 UICollectionView与UITableView很相似&#xff0c;必须实现两个代理&#xff1a;UICollectionViewDataSource和UI…

python之文件

1、什么是文件指针&#xff1f; 文件指针 文件指针标记从哪个位置开始读取数据 第一次打开文件时&#xff0c;通常文件指针会指向文件的开始位置 当执行了read方法后&#xff0c;文件指针会移动到读取内容的末尾 创建一个当前目录下的文件pass 内容为&#xff1a; westos …

一个6年的菜鸟,在4年之前做的一些功能(二)

前戏&#xff1a;针对上一篇列出来的功能点&#xff0c;今天和大家分享下这个自定义的公式是怎么设计的&#xff0c;由于我的第一篇博客在首页被管理员移走了&#xff0c;大家可以点击这里来跳转&#xff0c;看下第一篇的目录结构。本人作为老菜鸟&#xff0c;和大家分享的也是…

Oracle11.2新特性之listagg函数 (行列转换)

SELECT regexp_substr(公司1,贵公司2, [^,], 1, LEVEL, i) FROM dualCONNECT BY LEVEL < length(公司1,贵公司2) - length(REPLACE(公司1,贵公司2, ,, )) 1 以上为字符串带分隔符的转换为列 Oracle11.2新增了LISTAGG函数&#xff0c;可以用于字符串聚集&#xff0c;测试如下…

Mac 安装Android Studio

一、下载 可以通过以下这些网站下载Mac版的Android Studio http://www.androiddevtools.cn http://www.android-studio.org 二、安装 双击下载好的dmg文件&#xff0c;拖曳安装。 拷贝完成之后&#xff0c;在应用程序中打开Android Studio。这时候会引导进行环境安装和设置…

iscsi网络磁盘共享

iscsi(Internet SCSI)支持从客户端&#xff08;发起端&#xff09;通过IP向远程服务器上的ISCSI存储设备&#xff08;目标&#xff09;发送scsi命令。ISCSI限定名称用于确定发起端和目标&#xff0c;并采用iqn.yyy-mm.{reverse domain}:label的格式。 默认情况下&#xff0c;网…

转: IO设计模式:Reactor和Proactor对比

转: https://segmentfault.com/a/1190000002715832 平时接触的开源产品如Redis、ACE&#xff0c;事件模型都使用的Reactor模式&#xff1b;而同样做事件处理的Proactor&#xff0c;由于操作系统的原因&#xff0c;相关的开源产品也少&#xff1b;这里学习下其模型结构&#xff…

程序员该怎样放松?8个好网站推荐

1&#xff09;看风景程序员每天在液晶屏幕下工作很长时间&#xff0c;应该让干涩的眼睛得到好好的放松&#xff0c;偶尔看看窗外的绿树或远处的风景可能是不错的方式&#xff0c;但是这在北京上海广州这样的大城市里不太现实&#xff0c;所以这里推荐一个纯粹的分享旅行照片的网…

【iOS】UIButton 图标在上文字在下

iOS默认的UIButton是图片在左文字在右&#xff0c;但是很多时候需求是图片在上文字在下&#xff08;如效果图1、效果图2&#xff09;&#xff0c;因此想到&#xff0c;通过写一个JXButton继承自UIButton&#xff0c;并重写相关方法即可&#xff0c;以后项目中需要用的话就直接使…

多线程和mysql

多线程 1、多线程的定义&#xff1a; 什么是线程&#xff1a; 线程是操作系统能够进行运算调度的最小单位&#xff08;程序执行流的最小单元&#xff09;。它被包含在进程之中&#xff0c; 是进程中的实际运作单位。一个进程中可以并发多个线程&#xff0c;每条线程并行执行不…

poj2154-color-polyan次二面体+欧拉函数优化

N<1e9,O(nlogn)的做法会超时。从枚举置换转变为枚举轮换长度&#xff0c;然后可以利用欧拉函数&#xff0c;把复杂度变为O(√n * logn) 1 /*--------------------------------------------------------------------------------------*/2 3 #include <algorithm>4 #in…

【iOS】通讯录分组方式展示数据

本例子是将后台返回的医生列表&#xff08;包含姓名和电话&#xff0c;demo从plist文件读取&#xff09;&#xff0c;按拼音进行分组显示(A-Z)&#xff0c;最终效果如下图&#xff1a; 一、创建Doctor医生类: Doctor类属性包括姓名、电话以及姓名第一个字的拼音首字母&#xff…

LVS_DR实现(负载均衡)及LVS_DR+keepalived实现(高可用+负载均衡)

client->VS->RS->client(VS只做调度,RS为虚拟服务器) LVS_DR原理图解&#xff1a; 优点&#xff1a;负载均衡器只负责将请求包分发给物理服务器&#xff0c;而物理服务器将应答包直接发给用户。所以&#xff0c;负载均衡器能处理 很巨大的请求量&#xff0c;这种方式…

【LeetCode】136. Single Number 解题小结

题目&#xff1a; Given an array of integers, every element appears twice except for one. Find that single one. Note:Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory? 这题目的要求不仅是要求是线性时间…

iOS小技巧积累

平时项目中用到的&#xff0c;记录下来&#xff08;持续更新&#xff09;。1.在导航栏右边添加多个UIBarButtonItemUIBarButtonItem *searchScheduleBtn [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:"search_small"] style:UIBarButtonItemStylePl…

(转)iPhone开发经典语录集锦

1&#xff1a;如果无法保证子类行为的一致性&#xff0c;那么就用委托 If the subClass cannt keep with superClass,use delegate rather than inheritance. 2:屏幕上看到的&#xff0c;都是UIVew Everything you see on Screen is UIView. 3:如果对性能要求高&#xff0c;慎…

varnish 实现 CDN 缓存系统构建

cdn 搭建 (server1:172.25.1.1 ) : [roottest1 ~]# ls varnish-3.0.5-1.el6.x86_64.rpm varnish-libs-3.0.5-1.el6.x86_64.rpm [roottest1 ~]# yum install * -y [roottest1 ~]# cd /etc/varnish/ [roottest1 varnish]# vim /etc/sysconfig/varnish [roottest1 varnish]# sysct…

创建第一个 local network(I) - 每天5分钟玩转 OpenStack(80)

在 ML2 配置文件中 enable local network 后&#xff0c;本节将开始创建第一个 local network。 我们将通过 Web GUI 创建第一个 local network。 首先确保各个节点上的 neutorn agent 状态正常。GUI 菜单 为 Admin -> System -> System Infomation -> Neutron Agents…

【Android】AsyncTask异步类

一、关于AysncTask AsyncTask使得多线程编程更加简单&#xff0c;AsyncTask能在后台线程执行异步任务&#xff0c;并且在UI线程更新界面&#xff0c;而不再需要用户去操作Thread和Handler。AysncTask是一个抽象类&#xff0c;类关系如下&#xff1a; public abstract class As…

高手速成android开源项目【blog篇】

主要介绍那些乐于分享并且有一些很不错的开源项目的个人和组织。Follow大神&#xff0c;深挖大神的项目和following&#xff0c;你会发现很多。 一、个人 JakeWharton 就职于SquareGithub地址&#xff1a;https://github.com/JakeWharton代表作&#xff1a;ActionBarSherlock&a…

3、LVS_TUN实现负载均衡

LVS_TUN实现负载均衡 LVS 介绍: LVS 是 Linux Virtual Server 的简称,在实际环境中经常作为 B/S 结构的网络应用中的负载均衡器来使用,工作在 7 层网络模型中的,网络层,也就是通常说的 IP 层,由于数据的处理是在 Linux 内核态完成的,所以相对反向代理服务器来说,性能一般会高一…

【Android】Fragment官方中文文档

以下内容来自Android官方文档。 Fragment 表示 Activity 中的行为或用户界面部分。您可以将多个片段组合在一个 Activity 中来构建多窗格 UI&#xff0c;以及在多个 Activity 中重复使用某个片段。您可以将片段视为 Activity 的模块化组成部分&#xff0c;它具有自己的生命周期…

关于MSSQL导入导出时主键与约束丢失的问题解决

导入数据时&#xff0c;使用默认选项&#xff0c;会丢失主键、约束、默认值等属性&#xff0c;按如下步骤操作&#xff1a;-->导出向导 -->选择数据源 -->选择目的 -->指定表复制或查询&#xff1a;不要使用默认选项&#xff0c;选择“在SQL Server数据库之间复制对…

Java5中的线程池实例讲解

Java5增加了新的类库并发集java.util.concurrent&#xff0c;该类库为并发程序提供了丰富的API多线程编程在Java 5中更加容易&#xff0c;灵活。本文通过一个网络服务器模型&#xff0c;来实践Java5的多线程编程&#xff0c;该模型中使用了Java5中的线程池&#xff0c;阻塞队列…

LNMP架构的搭建

LNMP 架构的搭建 基础架构图 环境&#xff1a; server5: nginx mysql php //需要的安装包 (蓝色为解压后的文件) [roottest5 ~]# /etc/init.d/iptables stop //关掉防火墙 MYSQL 源码安装 [roottest6 ~]#yum install -y gcc gcc-c make ncurses-devel bison opens…

NSString属性什么时候用copy,什么时候用strong?

我们在声明一个NSString属性时&#xff0c;对于其内存相关特性&#xff0c;通常有两种选择(基于ARC环境)&#xff1a;strong与copy。那这两者有什么区别呢&#xff1f;什么时候该用strong&#xff0c;什么时候该用copy呢&#xff1f;让我们先来看个例子。 示例 我们定义一个类…

hihocoder 1152 Lucky Substrings

#1152 : Lucky Substrings 时间限制:10000ms单点时限:1000ms内存限制:256MB描述 A string s is LUCKY if and only if the number of different characters in s is a fibonacci number. Given a string consisting of only lower case letters, output all its lucky non-empt…

随笔,记2014忆往昔岁月

博客园开通了一年多&#xff0c;这是第一篇博客。在此记下我的第一篇博客&#xff0c;同时&#xff0c;回忆过去几年自己的工作所得所想所感。 大学毕业&#xff0c;工作两年半了&#xff0c;做过很多事&#xff0c;比较杂&#xff0c;做过需求&#xff0c;做过设计&#xff0c…

PHP相关关系及定义

CGI(是一种协议): 是为了保证web server传递过来的数据是标准格式的&#xff0c;方便CGI程序的编写者。 web server&#xff08;如nginx&#xff09;是内容的分发者。 处理静态页面&#xff1a; 如果请求/index.html&#xff0c;web server就可以解…