第七章:魔法方法、构造器等
1.魔法方法:
构造方法:
当一个对象被创建的时候自动调用的方法
class Foo:
def __init__(self):
self.value=10
>>f=Foo()
>>f.value
输出:10
重写一般的方法和特殊的构造方法
首先要有继承关系
class A:
def pri(self):
print(“hello A”)
class B(A):#继承A
def pri(self):
print(“hello B!”)
>>b=B()
>>b.pri()
输出:hello B!
另外两种继承的方法:
1.super(子类名,self).__init__(“超类的构造方法的参数”) 只能在新式类中使用
2.超类.__init__(“超类的构造方法的参数”) 不限
实例:
class Bird(object):
def __init__(self):
self.h=True
def eat(self):
if self.h:
print('eatting... ')
self.h=False
else:
print('do not hungry')
class Song(Bird):
def __init__(self):
super(Song,self).__init__()#Bird.__init__(self)调用超类的构造方法旧版Python中
self.sound='singing'
def sing(self):
print(self.sound)
sb=Song()
sb.sing()
sb.eat()
sb.eat()
input("<enter> for exit")
2.成员访问的一些方法
__len(self)__返回集合中所有项目的数量,对于序列来说就是元素的个数,映射是键值对的个数
__getitem(self,key)__获取所对应key的键值,序列是0~n-1的整数,映射则是任何种类的键
__setitem(self,key,value)__设置所对应key的键值,序列是0~n-1的整数,映射则是任何种类的键
__delitem(self,key)__删除所对应key的键值,序列是0~n-1的整数,映射则是任何种类的键
以上方法都是对于self对象使用的,因此在使用的时候可能会抛出一些异常。
3.子类化列表、字符串和字典
继承内建类型(如list,UserList,UserString,UserDict)然后重写构造方法
4.关于属性
在新类中
class Rec:
def __init__(self):
self.width=0
self.height=0
def setSize(self,size):
self.width,self.height=size
def getSize(self):
return self.width,self.height
size=property(getSize,setSize)
>>r=Rec()
>>r.width=10
>>r.height=5
>>r,size
输出:(10,5)
>>r.size=100,100
输出r.width=100,r.height=100
在上例中用property()函数将取值和赋值的方法包装(按照顺序)定义为size属性,size属性包含取值和计算。
property()可以有0,1,2,3,4个参数,0个参数表示产生的属性不能读也不能写 property(fget=None,fset=None,fdel=None,doc=None)
前面3个参数都是未绑定的方法,所以它们事实上可以是任意的类成员函数
property()函数前面三个参数分别对应于数据描述符的中的__get__,__set__,__del__方法,所以它们之间会有一个内部的与数据描述符的映射。最后一个表示文档字符串。
5.静态方法和类成员
class Rec:
@staticmethod
def setSize():
print()
@classmethod
def getSize(self):
pass
静态方法无绑定,和普通函数使用方法一样,只是需要通过类或者实例来调用。没有隐性参数。
类方法通过隐性参数绑定在类上,函数内可通过隐性参数进行实例生成。
一些其他重要方法:
__getattribute__(self,name):当特性被访问时自动调用(只能在新式类中)
__getattr__(self,name):当特性name被访问且对象没有相应的特性时自动调用
__setattr__(self,name,value):当试图给name赋值时自动调用
__delattr__(self,name)__当试图删除特性name时调用
6.迭代器
class Fibs:
def __init__(self):
self.a=0
self.b=1
def __next__(self):
self.a=self.b
self.b=self.a+self.b
return self.a
def __iter__(self):
return self
迭代器就是_iter__()方法,返回对象本身,可以参与到for循环中。一个实现了__iter__()方法的对象是可以迭代的,实现了__next()__()方法才是迭代器
另外内建函数iter()也可以获得迭代器
it=iter([1,2,3])
>>it.next()
输出1
>>it.next()
输出2
迭代器方法,只要对象创建了,迭代器就产生了,这点要注意,和构造方法类似,另外迭代器既然可以迭代,那就能生成列表,用list()方法.
7.生成器
任何包含yield的语句都是生成器
nes=[[1,2][3,4],[5]]
def fla(nes):
for i in nes:
for j in i:
yield j
>>for num in fla(nes)
输出num:1 2 3 4 5
和return不同的是,yield每次产生多个值,如果产生一个值,函数就会被冻结,等待激活,才能继续执行。
生成器推导式,和列表推导式类似,不过返回的不是列表,而是生成器(并且不会立刻循环),可以一步步计算。
>>g=((i+2)**2 for i in range(2,27))
8.递归生成器
nes=[[1,2][3,4],[5]]
def fla(nes):
try:
for i in nes:
for j in nes[i]:
yield j
Except TypeError:
yield nes
>>for num in fla(nes)
输出num:1 2 3 4 5
但是要判断字符串,就不在此赘述。
9.生成器方法
外部作用域访问生成器:send() 方法,需要参数,访问next(),只有在内部生成器挂起之后才能执行,也就是yield第一次执行之后,参数为None的时候,启动生成器
throw方法,在yield表达式中,引发一个异常。
close方法,停止生成器
模拟生成器:
def fla(nes):
res=[]
try:
try:nes+’’
except TypeError:pass
else:raise TypeError
for i in nes:
for j in nes[i]:
res.append(j)
Except TypeError:
res.append(j)
return res
相关推荐
《从零开始学Python数据分析与挖掘》官方纠错 P57:代码中的注释有误,第二段代码的最后一个注释,需改成下方: # 第2至4行,2至5列 print(arr2[1:4,1:5])
从零开始学Python:循环结构.docx从零开始学Python:循环结构.docx从零开始学Python:循环结构.docx从零开始学Python:循环结构.docx从零开始学Python:循环结构.docx从零开始学Python:循环结构.docx从零开始学...
将自己的python学习经历共享上传 挺适合零基础的人员学习 从零开始学python
从零开始学Python:Python语言中的变量.docx从零开始学Python:Python语言中的变量.docx从零开始学Python:Python语言中的变量.docx从零开始学Python:Python语言中的变量.docx从零开始学Python:Python语言中的变量...
从零开始学Python:第一个Python程序.docx从零开始学Python:第一个Python程序.docx从零开始学Python:第一个Python程序.docx从零开始学Python:第一个Python程序.docx从零开始学Python:第一个Python程序.docx从零...
从零开始学Python数据分析与挖掘 从零开始学Python数据分析与挖掘
Python 是一种面向对象、解释型计算机程序设计语言,由 Guido van Rossum 于 1989 年底发明,第一个公开 发行版发行于 1991 年。Python 语法简洁而清晰,具有丰富和强大的类库。它常被昵称为胶水语言,能够把用其 他...
从零开始学python
从零开始学Python从零开始学Python
从零开始学Python教程配套代码,零开始学Python开发案例,爬取套图、操作数据库、爬取小说、爬取小说存入数据库、小说网站雏形、日志框架、微信监控、人脸识别、Django后台
将自己的python学习经历共享上传 挺适合零基础的人员学习 从零开始学python
从零开始学Python网络爬虫1
从零开始学Python程式设计(适用Python 3.5以上)畅销回馈版
从零开始学Python AI开发系列141
从零开始学Python AI开发系列121
从零开始学Python AI开发系列351
从零开始学Python AI开发系列431
从零开始学Python AI开发系列471