【廖雪峰Python学习笔记】面向对象高级编程
文章目录
- 为实例和类绑定属性和方法
- \_\_slots__限制当前class实例,对子类不管用
- @property装饰器,将`getter`方法变成属性
- 多重继承 —— 一个子类可同时获得多个父类的所有功能[`Mixin`]
- 定制类
- 枚举类
- 元类
为实例和类绑定属性和方法
- 创建类
class Animal(object):pass
- 绑定实例
>>> dog = Animal() # 创建实例
>>> dog.name = 'Dura' # 为实例添加属性>>> def set_age(self,age): # 为实例添加方法self.age = age
>>> from type import MethodType
>>> dog.set_age = MethodType(set_age,dog)>>> dog.set_age(2) # dog.age 2
>>> cat = Animail()
>>> cat.age # 实例添加的属性或方法,其他实例不可调用
Traceback (most recent call last):File "<stdin>", line 1, in <module>
AttributeError: 'Animal' object has no attribute 'set_age'>>> Animal.set_age = set_age # 为类添加方法,实例均可调用
__slots__限制当前class实例,对子类不管用
class Animal(object):__solts__ = (name,age) # 实例不能访问或修改除了name/age以外的属性class Dog(Animal):pass # 子类Dog的实例可以创建自己的属性
@property装饰器,将getter
方法变成属性
class Animal(object):@propety # 将gettar方法变成属性,创建了一个@birth.settar的装饰器def birth(self):return self._birth@birth.setter # @birth.settar装饰器将setter方法变成属性赋值def birth(self,value):if not isinstance(value, int):raise ValueError('Bad Vaule Type') self._birth = value@propety # 只定义getter方法,不定义setter方法时,则该属性为只读属性def age(self):return 2019 - self._birth
多重继承 —— 一个子类可同时获得多个父类的所有功能[Mixin
]
class AMixin(object): # Mixin : 给一个类增加多个功能def foo(self):print('A foo')def bar(self):print('A bar')class BMixin(object):def foo(self):print('B foo')def bar(self):print('B bar')class C1Mixin(AMixin,BMixin): # 继承顺序:入度为0 -- 最左原则 passclass C2Mixin(AMixin,BMixin):def bar(self):print('C2-bar')class D(C1Mixin,C2Mixin):passif __name__ == '__main__':print(D.__mro__) d=D()d.foo()d.bar()
继承关系图为
输出结果为
(<class '__main__.D'>, <class '__main__.C1'>, <class '__main__.C2'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>)
A foo
C2-bar
定制类
形如__xxx__的变量或函数名
__str__()
:打印实例更好看
class Animal(object):def __init__(self,name):self.name = namedef __str__(self):return 'Animal Object (name: %s)' % self.name
声明实例调用时,可调用__str__(),隐藏实例内部信息
>>> ani = Animal('Jessica')
>>> ani # 直接显示变量调用的是__repr__()函数,而不是__str__()
<__main__.Student object at 0x109afb310>
>>> print(ani) # 打印是给客户看的;直接显示是给程序开发者看的,用于调试
'Animal Object (name: Jessica)'
__iter__()
:用于类中存在for … in …的情况,返回一个迭代对象
class Fib(object):def __init__(self): # 初始化计算器a,bself.a, self.b = 0, 1def __iter__(self): # 实例本身就是迭代对象,返回自己return selfdef __next__(self): # 获取循环的下一个值,直到循环结束self.a, self.b = self.b, self.a + self.bif(self.a > 10): # 循环截止条件raise Stopiteration()return self.a
获取结果
>>> for i in Fib()print(i)
1
1
2
3
5
8
__getitem__()
:根据下标获取元素
class Fib(object):def __getitem__(self,n):a, b = 1, 1for x in range(n):a, b = b, a + breturn a
获取结果
>>> f = Fib()
>>>f[3]
3
__getattr__()
:未找到属性的情况下,调用
class Chain(object):def __init__(self, path=''):self._path = pathdef __getattr__(self, path): # 没有找到路径时,调用return Chain('%s/%s' % (self._path, path))def __str__(self): # 修改打印信息,隐藏类的关键信息return self._path__repr__ = __str__ # 直接显示与打印内容相同
获取结果
>>> Chain().status.user.timeline.list
/status/user/timeline/list
__call__()
:直接对实例进行调用
class Animal(object):def __init__(self, name):self.name = namedef __call__(self): print('Hello, %s' % self.name)
获取结果
>>> ani = Animal('Beer')
>>> ani()
'Hello, Beer'
通过callable()函数,可判断一个对象是否为“可调用”对象
>>> callable(Animal())
True
>>> callable([1,2,3])
False
枚举类
定义一个Month的枚举类,可以直接引用一个常量或枚举出所有成员
from enum import Enum
Month = Enum('Month', ('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun','Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'))for name,member in Month.__members__.items(): # 枚举所有成员print(name, '=>', member, ',', member.value);
输出为:
Jan => Month.Jan , 1
Feb => Month.Feb , 2
Mar => Month.Mar , 3
Apr => Month.Apr , 4
May => Month.May , 5
Jun => Month.Jun , 6
Jul => Month.Jul , 7
Aug => Month.Aug , 8
Sep => Month.Sep , 9
Oct => Month.Oct , 10
Nov => Month.Nov , 11
Dec => Month.Dec , 12
更精确地控制枚举类型
from enum import Enum
@unique # 检查保证无重复值
class Weekday(Enum):Sun = 0 # name为Sun,iterm为Weekday.Sun的value为0Mon = 1Tue = 2Wed = 3Thu = 4Fri = 5Sat = 6print(Weekdy.Sun)
print(Weekdy.Sun.value)for name,member in Weekday.__members__.items():print(name, '=>', member)
输出为:
Weekdy.Sun
0
Sun => Weekday.Sun
Mon => Weekday.Mon
Tue => Weekday.Tue
Wed => Weekday.Wed
Thu => Weekday.Thu
Fri => Weekday.Fri
Sat => Weekday.Sat
元类
type()函数构建class方法:
def f(self, name = 'world'): # 定义函数print('Hello, %s' % name)Hello = type('Hello', (object,), dict(hello = f)) # type()定义class,三个参数(class名称,继承的父类集合,定义class内置方法)
h = Hello() # 初始化实例h
print(h.hello()) # ‘Hello, World'
print(type(Hello)) # <class 'Type'> class的类型为‘type’
print(type(h)) # <class '__main__'.Hello> 实例的类型为class
相关文章:

5分钟 搭建免费个人博客
五分钟倒数已经可以计时了。 三步完成免费个人博客搭建, 这是一篇小白也能看懂的文章,本文主要针对mac OS ,Windows 除了软件安装方式和命令有些区别(装了git bash也一样),其他基本一样。 你可能会经常看到…

基数排序之算法
一、定义基数排序是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。由于整数也可以表达字符串(比如名字或日期)和特定格式的浮点数,所以基数排序也不是只能使用于整数。二、…

MyBaties学习记录
typeAliases详解: 类型别名是为 Java 类型设置一个短的名字。它只和 XML 配置有关,存在的意义仅在于用来减少类完全限定名的冗余;(也就是为类型设置简称) 实例: 通过包名称加上简称调用代替; 注解表示: // …

【廖雪峰Python学习笔记】错误、调试、测试
文章目录错误处理调试单元测试unitcase文档测试错误类型程序编写问题bug – 字符类型错误等用户输入错误 – 输入不符合规定的字符串异常,程序运行时无法预测 – 磁盘满了,无法写 错误处理 错误处理机制:try…except…finally… try运行可…
iOS开发——手势识别器(用手势实现图片旋转和缩小放大)
iOS开发中,除了有关触摸的这组方法来控制用户的手指触控外,还可以用UIGestureRecognize的衍生类来进行判断,方便了开发。 UIGestureRecognize的子类类别有以下几种: UITapGestureRecognizer //轻拍识别器UIPinchGestureRecognize…
直播APP常用动画效果
作者: 落影loyinglin 地址: http://www.jianshu.com/p/a9a201ed3aa8 介绍 记录、总结开发遇到一些问题,大家一起交流学习。 这次带来,对直播APP的常用动画总结。 效果展示 下面是一个很多平台都有的入门豪华礼物动画——烟花。 一个复杂的礼物动画&…

windows8下安装Visual Studio2008
windows8下安装Visual Studio2008是一个比较麻烦的事情,不过经过我3个小时的奋斗终于安装成功了。这是我安装Visual Studio 2008过程中遇到的最复杂的一次。 下面我用图解的方式,一步一步的说明安装Visual Studio2008的过程。 第一步:因为win…

[SDK文档]SDK简介
文档链接:https://docs.growingio.com/docs/sdk-integration SDK工作方式 主要内容:GIO采集内容,数据安全措施,针对数据采集的控制项 JS SDK 添加GIO跟踪代码于<head>...</head> 之间异步加载,不影响网…

mysql主从库配置ps:mysql5.6
1 Mysql cluster版本主从服务器搭建实践 主从的作用:MySQL的主从服务器可以满足同步数据库,同步表,同步表内容,也可以指定仅同步某个数据库或某个表,还可以排除不同步某个数据库某个表。 同步原理:主从数据…

XCODE 4.5 IOS多语言设置
转:http://blog.csdn.net/samuelltk/article/details/8480403 前些天升级到Xcode4.5,现在正在用Xcode4.5IOS6开发项目,当使用国际化时,遇到了一点问题,之前版本Xcode上新建Localizable.strings后,添加语言的…
socket第三方库 AsyncSocket(源码注释解读.转)
作者 OneTea 关注 2016.09.19 11:33* 字数 0 阅读 83评论 0喜欢 1#import <Foundation/Foundation.h> class AsyncSocket;//async异步的 synchro同步 class AsyncReadPacket; class AsyncWritePacket; //extern来说可以理解为扩展吧是这样的是从一个类扩展到另一个类中的…

【每日一学】复杂度分析
文章目录目标什么是数据结构复杂度分析目标 建立时间复杂度、空间复杂度意识,写出高质量的代码能够设计基础架构提高编程技能训练逻辑思维 什么是数据结构 广义:一组数据的存储结构 | 操作数据的一种方法 解决问题:如何更快更省的处理数据…

noip2010提高组3题题解 by rLq
本题地址http://www.luogu.org/problem/show?pid1525 关押罪犯 题目描述 S 城现有两座监狱,一共关押着N 名罪犯,编号分别为1~N。他们之间的关系自然也极不和谐。很多罪犯之间甚至积怨已久,如果客观条件具备则随时可能爆发冲突。我们用“怨气…

hdu 1306(字符串匹配)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid1306 思路:一开始还以为是求最长公共序列呢。。。仔细一看,orz.....就是求两个串匹配时公共部分字符最多相同的个数。。。 View Code 1 #define _CRT_SECURE_NO_WARNINGS2 #include<…

iOS之使用CoreImage进行人脸识别
更新 :应各位朋友的需求,补上了OC版本的demo, OC版下载地址 另外附上 : swift版下载地址 CoreImage是Cocoa Touch中一个强大的API,也是iOS SDK中的关键部分,不过它经常被忽视。在本篇教程中,我会带大家一起…

[HTTP协议]入门篇
文章目录http的前世今生1. 史前时期2. 创世纪3. 从产生到发展HTTP是什么与HTTP相关的各种概念与HTTP相关的技术TCP/IP协议栈http的前世今生 1. 史前时期 20世纪60年代,美国国防部高等研究计划署ARPA建立ARPA网,四个分布在各地的节点20世纪70年代&#…

CSS中实现DIV容器垂直居中
1.vertical-align:middle 垂直对齐 如表格元素中的<td>、<th>、<caption>等,而像<DIV>、<span>这样的元素是没有valign特性的,因此使用vertical-align对它们不起作用。 2.text-align:center 文本水平居中 一、…
如何制作自己的CocoaPod库
作者 OneTea 关注 2016.12.29 18:02* 字数 848 阅读 102评论 0喜欢 6制作流程图: 流程图1.将代码托管在github上 1.1本地代码 如图: Snip20161228_7.png在github上创建 并上传 Snip20161228_3.png切换到本地项目cd xxx路径后 用git命令行 (…

【HTTP协议】域名
1. 域名的出现 IP协议将物理网卡的MAC地址抽象转化为4位数字数字化的IP地址对人不友好,需要友好的域名便于人类识别标记 2. 域名的形式 域名是一个有层次的结构——一串用’.分隔的多个单词【主机名.二级域名.顶级域名】最左边是主机名【eg:www提供万…

iOS 多级下拉菜单
前言 App 常用控件 -- 多级下拉菜单, 如团购类, 房屋类, 对数据进行筛选. 有一级, 二级, 三级, 再多就不会以这种样式,呈现给用户了. 作者就简单聊一下 多级下拉菜单 二级下拉筛选菜单.png一 目标 默认显示一个 TableView, 点击数据后, 添加第二个TableView, 并实现大小变化第二…

fork有啥用
#include <stdio.h>#include <sys/types.h>#include <unistd.h>int main(){ pid_t pid1; pid_t pid2; pid1 fork(); pid2 fork(); printf("pid1:%d, pid2:%d\n", pid1, pid2);}输出:pid1:3411, pid2:3412 //父进…

Html Agility Pack基础类介绍及运用
Html Agility Pack 源码中的类大概有28个左右,其实不算一个很复杂的类库,但它的功能确不弱,为解析DOM已经提供了足够强大的功能支持,可以跟jQuery操作DOM媲美:) 基础类和基础方法介绍 Html Agility Pack最常…

【Python自动化测试】setuptools
setuptools Python标准的打包分发工具使用简单的setup.py文件,将Python应用打包 最基础的setup.py文件 #!/usr/bin/env python3 # -*- coding: utf-8 -*- from setuptools import setup setup(nameMyDemo, # 应用名version1.0, # 版本号packages[myd…

企业级-Mysql双主互备高可用负载均衡架构(基于GTID主从复制模式)(原创)
前言:原理与思想这里选用GTID主从复制模式Mysql主从复制模式,是为了更加确保主从复制的正确性、健康性与易配性。这里做的是两服务器A,B各有Mysql实例3310,两个实例间互为主从主从复制模式采用GTID主从复制模式,在服务器A,B上配置…

Objective-C自动生成文档工具:appledoc
作者 iOS_小松哥 关注 2016.12.13 15:47* 字数 919 阅读 727评论 10喜欢 35由于最近琐事比较多,所以好久没有写文章了。今天我们聊一聊Objective-C自动生成文档。 做项目的人多了,就需要文档了。手工写文档是一件苦差事,但是我们也有从源码中…

void main()是错的!
很多人甚至市面上的一些书籍,都使用了void main( ),其实这是错误的。C/C中从来没有定义过void main( )。C之父Bjarne Stroustrup在他的主页上的FAQ中明确地写着The definition void main( ) { /* ... */ } is not and never has been C, nor has it even…

Some tips
VScode自动换行 Code -> Perference -> Setting [ “editor.wordWrap”: “on” ]

iOS 自定义转场动画初探
最近项目刚迭代,正好闲下来捣鼓了一下iOS的自定义转场的效果。闲话不多说,直接开始上代码吧。(ps:请忽略实际的转场效果,关注技术本身呢哦。pps:主要是转场的动画做的比较low啦!) 1、首先定义一个转场动画的…

Delphi实现WebService带身份认证的数据传输
WebService使得不同开发工具开发出来的程序可以在网络连通的环境下相互通信,它最大的特点就是标准化(基于XML的一系列标准)带来的跨平台、跨开发工具的通用性,基于HTTP带来的畅通无阻的能力(跨越防火墙)。WebService给我们的软件开发带来了诸多好处,但是有一点还是必须要考虑到…

【Linux学习笔记】 - 什么是Linux?
Linux Linux内核 GNU工具 组成部分 Linux内核GUN工具图形化桌面环境应用软件 Linux内核 地位:Linux核心,控制计算机系统上的所有硬件和软件。必要时,分配硬件,并根据需要执行软件 主要功能: a. 系统内存存储 ——…