Python类的进阶.md
属性绑定
- 在python中可以给类对象动态的绑定属性
- 但是由于这种特性,随意动态绑定也会带来麻烦,因此可用__slots__来限制可绑定的属性名称
- __slots__的绑定对于子类是不生效的,只对当前类实例生效
#对于模块Animal.py的说明
'a demo of class type'
#作者
__author__ = 'liyue'
class Man(object):
def __init__(self, name):
self.name = name
class Woman(object):
#限制绑定的属性名称为name和age,除此之外均不可
__slots__ = ('name', 'age')
class PrintInfo(object):
def testMain():
m = Man('zhangsan')
#给m绑定name和age
m.age = 20
m.hight = 180
print(m.age, m.hight)
#给w绑定变量,但是hight在绑定列表之外,所以会报错
w = Woman()
w.name = 'lisi'
w.age = 20
w.hight = 180
print(w.name, w.age, w.hight)
if __name__ == '__main__':
PrintInfo.testMain()
属性@property
- 使用@property来定义类的属性,可以对属性进行限制和检查:
#对于模块Animal.py的说明
'a demo of class type'
#作者
__author__ = 'liyue'
class Man(object):
#给age赋一个不可变的值
_age = 20
_name = ''
#定义age的@property属性
@property
def age(self):
#注意这里的写法
return self._age
#定义name的属性
@property
def name(self):
return self._name
#定义name的setter方法
@name.setter
def name(self, value):
if not isinstance(value, str):
raise ValueError('name must be a str')
self._name = value
class PrintInfo(object):
def testMain():
m = Man()
print(m.age)
#这一句会报错,因为没有对age定义age的setter方法
#m.age = 30
print(m.name)
m.name = 'wangwu'
print(m.name)
if __name__ == '__main__':
PrintInfo.testMain()
多继承和Mixin模式
python支持多继承,只需要将继承的类放到定定义中
但是在设计中一个类职责尽量单一,即使有需要增加其他功能,不要通过多重继承来实现。这样的话会增加代码的复杂度。在这里使用Mixin模式通过组合的形式来实现功能
#对于模块Animal.py的说明
'a demo of class type'
#作者
__author__ = 'liyue'
#定义主类
class Aniaml(object):
def isAnimal(self):
print( 'i am an animal')
#定义不同的功能类,注意,这些功能类职责要单一
#这些类名统一的规则用Mixin作为后缀是为了方便维护和理解,一看就能知道使用了Mixin模式
class FlyMixin(object):
def isFly(self):
print( 'i can fly')
class RunMixin(object):
def isRun(self):
print( 'i can run')
class PrintInfo(object):
def testMain():
pass
#定义实现类,使用了Mixin模式,具备了各种功能
class Bird(Aniaml, RunMixin, FlyMixin):
pass
#只继承了基类,所以不支持各种功能
class Man(Aniaml):
pass
class PrintInfo(object):
def testMain(self):
print('Bird:')
b = Bird()
b.isAnimal()
b.isFly()
b.isRun()
print('man:')
m = Man()
m.isRun()
if __name__ == '__main__':
p = PrintInfo()
p.testMain()
类的输出:str__和__repr
在日志或者调试中需要打印类的信息,可以重写__str__方法来实现:
#对于模块Animal.py的说明
'a demo of class type'
#作者
__author__ = 'liyue'
#定义主类
class Aniaml(object):
def isAnimal(self):
print( 'i am an animal')
#重写Animal类的打印信息,此方法用于输出,对用户
def __str__(self):
return "This is class Animal."
#重写了__repr__方法,此方法用于调试输出
def __repr__(self):
return 'This is class Animal.'
class PrintInfo(object):
def testMain(self):
a = Aniaml()
#调用了__str__方法
print(a)
if __name__ == '__main__':
p = PrintInfo()
p.testMain()
类的迭代器__iter__
iter
Python中类可以在for循环中迭代,类中实现了__iter__()方法即可以在循环中返回迭代对象。和__iter__()方法匹配的还有__next__()方法,二者需要同时完成。
#对于模块Animal.py的说明
'a demo of class type'
#作者
__author__ = 'liyue'
class AutoLoop(object):
def __init__(self, maxNum):
#这里定义了变量,所以后面变量都需要用self.var的形式
self.maxNum = maxNum
self._startNum = 0
#定义这个类的迭代器,必须返回自己
def __iter__(self):
return self;
#next方法也是必须实现的
def __next__(self):
#循环的执行体
self._startNum += 1
#循环退出的条件,必须有
if self.maxNum < self._startNum:
#退出循环,固定
raise StopIteration()
#每次循环的返回值
return self._startNum
if __name__ == '__main__':
#a = AutoLoop(6
for n in AutoLoop(6):
print(n)
类的迭代器-获取指定元素:getitem()
重写_getitem__()方法可以让刚才的例子像list一样通过下标获取指定位置元素的值:
#对于模块Animal.py的说明
'a demo of class type'
#作者
__author__ = 'liyue'
class AutoLoop(object):
def __init__(self, maxNum):
#这里定义了变量,所以后面变量都需要用self.var的形式
self.maxNum = maxNum
self._startNum = 0
#定义这个类的迭代器,必须返回自己
def __iter__(self):
return self;
#next方法也是必须实现的
def __next__(self):
#循环的执行体
self._startNum += 1
#循环退出的条件,必须有
if self.maxNum < self._startNum:
#退出循环,固定
raise StopIteration()
#每次循环的返回值
return self._startNum
#取第n个元素
def __getitem__(self, n):
a, b = 1, 1
for x in range(n):
a, b = b, a + b
return a
if __name__ == '__main__':
#a = AutoLoop(6
for n in AutoLoop(6):
print(n)
a = AutoLoop(8)
print('取类中的第二个元素的值:%d' % a[2])
这里还可以实现list的切片方法:
#...
def __getitem__(self, n):
if isinstance(n, int): # n是索引
a, b = 1, 1
for x in range(n):
a, b = b, a + b
return a
if isinstance(n, slice): # n是切片
start = n.start
stop = n.stop
if start is None:
start = 0
a, b = 1, 1
L = []
for x in range(stop):
if x >= start:
L.append(a)
a, b = b, a + b
return L
#...
同理__getitem__()的参数检查还要继续完善,才是一个健壮的函数。对于类来说还有__setitem__()和__delitem__()方法可以实现。
枚举类
从Enum派生出我们自己的自定义类,并用@unqire关键字限制重复的枚举对象;
#导入枚举包
from enum import Enum, unique
'a enum class'
__author__ = 'liyue'
#unique关键字检查重复
@unique
class Wether(Enum):
Sunny = 0
Rain = 1
Snow = 2
if __name__ == '__main__':
w1 = Wether.Sunny
print(w1)
print(w1.value)
Python类的进阶.md的更多相关文章
- python 类的进阶
类的进阶 一 isinstance(obj,cls)和issubclass(sub,super) class Foo: def __init__(self,name): self.name = nam ...
- Python类的继承(进阶5)
转载请标明出处: http://www.cnblogs.com/why168888/p/6411918.html 本文出自:[Edwin博客园] Python类的继承(进阶5) 1. python中什 ...
- python 面向对象(进阶篇)
上一篇<Python 面向对象(初级篇)>文章介绍了面向对象基本知识: 面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类 是一个模板,模板中包装了多个“函数”供使 ...
- python基础——面向对象进阶下
python基础--面向对象进阶下 1 __setitem__,__getitem,__delitem__ 把对象操作属性模拟成字典的格式 想对比__getattr__(), __setattr__( ...
- python基础——面向对象进阶
python基础--面向对象进阶 1.isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象 ...
- python面向对象编程进阶
python面向对象编程进阶 一.isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象 1 ...
- Python语言学习之Python入门到进阶
人们常说Python语言简单,编写简单程序时好像也确实如此.但实际上Python绝不简单,它也是一种很复杂的语言,其功能特征非常丰富,能支持多种编程风格,在几乎所有方面都能深度定制.要想用好Pytho ...
- 【转】python 面向对象(进阶篇)
[转]python 面向对象(进阶篇) 上一篇<Python 面向对象(初级篇)>文章介绍了面向对象基本知识: 面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类 ...
- 【转】Python之函数进阶
[转]Python之函数进阶 本节内容 上一篇中介绍了Python中函数的定义.函数的调用.函数的参数以及变量的作用域等内容,现在来说下函数的一些高级特性: 递归函数 嵌套函数与闭包 匿名函数 高阶函 ...
随机推荐
- Delphi7 中文汉字转网址格式 Utf8编码转换(淘宝搜索中文转网址)
function HttpEncode(S:AnsiString):string; var P:^Byte; I:Cardinal; begin Result:=''; P:=@S[1 ...
- MySQL客户端管理
mysql -P3306 -h localhost -u root -p 分别是:端口 服务器 用户名 有密码(这里可以先不用输入,带这个参数表示有密码,密码在打开客户端后输入,也可以在这里直接输入 ...
- oracle比较一行的最大值或最小值
1. COALESCE 返回该表达式列表的第一个非空value. 格式: COALESCE(value1, value2, value3, ...) 含义: 返回value列表第一个非空的值. val ...
- nginx安装环境
1 nginx安装环境 nginx是C语言开发,建议在linux上运行,本教程使用Centos6.5作为安装环境. n gcc 安装nginx需要先将官网下载的源码进行编译,编译依赖gcc环境,如果没 ...
- 错误为Lc.exe已退出,代码为-1
近来在做项目的时候,突然遇到 了 LC.exe 已退出,代码为-1 的提示,怎么也编译不了,在查了相关的资料后,终于明白了原因,其解决方案如下 : 1. 以管理员的身份来运行vs, 并把项目中“pro ...
- jsfiddle修改个人头像
找了半天终于知道修改jsfiddle头像的方法了~ JsFiddle将Gravatar - 全球认可的头像用于个人资料图片.必须在这里改变你的头像,它也会在jsFiddle中自动更新. 注意,两者的注 ...
- wordpress写文章添加gif图片变成静态图片的解决办法
添加文章时gif只能静态,记得在添加时选择完整尺寸,不要压缩即可
- 安全测试4_客户端的安全漏洞(XSS、CSRF、点击劫持、URL跳转)
那个fanh前面学习的都是基础,现在开始正式学习下安全的知识,这一章主要讲解客户端常见的安全漏洞. 看到这个不错,给大家记一下: 1.常见的安全事件: 2.XSS(跨站脚本),英文全称:Cross S ...
- StanFord ML 笔记 第五部分
1.朴素贝叶斯的多项式事件模型: 趁热打铁,直接看图理解模型的意思:具体求解可见下面大神给的例子,我这个是流程图. 在上篇笔记中,那个最基本的NB模型被称为多元伯努利事件模型(Multivariate ...
- 《算法》第二章部分程序 part 5
▶ 书中第二章部分程序,加上自己补充的代码,包括利用优先队列进行多路归并和堆排序 ● 利用优先队列进行多路归并 package package01; import edu.princeton.cs.a ...