魔术方法,属性,迭代器
岁月有你,惜惜相处
阅读本文需要5分钟
1.13.1 魔术方法:
- 在Python中的面向对象中有很多魔术方法如:
__init__: 构造函数,在生成对象时调用 __del__: 析构函数,释放对象时使用 __str__: 使用print(对象)或者str(对象)的时候触发 __repr__: 在使用repr(对象)的时候触发 __setitem__ : 按照索引赋值:每当属性被赋值的时候都会调用该方法:self.__dict__[name] = value __getitem__: 按照索引获取值:当访问不存在的属性时会调用该方法 _delitem__(self,name): 当删除属性时调用该方法 __len__: 获得长度 __cmp__: 比较运算 __call__: 函数调用 __add__: 加运算 __sub__: 减运算 __mul__: 乘运算 __div__: 除运算 __mod__: 求余运算 __pow__: 乘方 ...
- 注意:
__setitem__
: 每当属性被赋值的时候都会调用该方法,因此不能再该方法内赋值 self.name = value 会死循环 __str__
函数用于处理打印实例本身的时候的输出内容。如果没有覆写该函数,则默认输出一个对象名称和内存地址。
class Stu: name= '张三' age = 20 def __str__(self): return "姓名:%s; 年龄:%d"%(self.name,self.age) s = Stu() print(s) 姓名:张三; 年龄:20
- 析构魔术方法,当对象从内存被释放前调用的方法,目的是做一些释放销毁工作。
class Demo: def __init__(self,x): self.x = x; print("create demo...",self.x) def __del__(self): print("del demo....",self.x) d1 = Demo(1) d2 = Demo(2) d3 = Demo(3) del d3
# 输出 create demo... 1 create demo... 2 create demo... 3 del demo.... 3 del demo.... 1 del demo.... 2
__add__
: 加运算
class Vector: def __init__(self, a, b): self.a = a self.b = b def __str__(self): return 'Vector (%d, %d)' % (self.a, self.b) def __add__(self,other): return Vector(self.a + other.a, self.b + other.b) v1 = Vector(2,10) v2 = Vector(5,-2) print (v1 + v2) # 以上代码执行结果如下所示: # Vector(7,8)
1.13.2 属性和方法
property() 函数的作用是在新式类中返回属性值
* ```class property([fget[, fset[, fdel[, doc]]]])``` * fget -- 获取属性值的函数 * fset -- 设置属性值的函数(可选) * fdel -- 删除属性值函数(可选) * doc -- 属性描述信息(可选)
# 定义一个矩形类,假象有一个size特性访问器方法 class Rectangle: 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 #测试 rt = Rectangle() #rt.width=100 #rt.height=50 rt.setSize((200,100)) #赋值 print(rt.getSize()) #(200,100)
- 对应上面的实例,
class Rectangle: 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,fdel) rt = Rectangle() #rt.width=100 #rt.height=50 rt.setSize((200,100)) print(rt.getSize()) rt.size = 10,5 print(rt.size) # 200, 100 10, 5
静态方法和类成员方法(区别是有无带参数)
- 使用staticmethod()和classmethod()函数 或使用@staticmethod和@classmethod装饰器
class MyClass1: def smeth(): print('这是一个静态方法') smeth = staticmethod(smeth) def cmeth(cls): print("这是一个类成员方法",cls) cmeth = classmethod(cmeth) MyClass1.smeth() MyClass1.cmeth() #或使用使用@staticmethod和@classmethod装饰器 class MyClass2: @staticmethod def smeth(): print('这是一个静态方法') @classmethod def cmeth(cls): print("这是一个类成员方法",cls) MyClass2.smeth() MyClass2.cmeth()
# 输出 这是一个静态方法 这是一个类成员方法 <class '__main__.MyClass1'> 这是一个静态方法 这是一个类成员方法 <class '__main__.MyClass2'>
- 使用hasattr()函数判读对象中是否存在指定的非私有属性和方法:
class B: name="zhangsan" __age=20 def bb(self): print("bbbbb") def __cc(self): print("cccc") b = B() print(hasattr(b,"name")) #True print(hasattr(b,"__age")) #False print(hasattr(b,"sex")) #False print(hasattr(b,"bb")) #True print(hasattr(b,"__cc")) #False
1.13.3 迭代器:
- 指定数据创建迭代器(使用iter()和next() )
x = [1, 2, 3] #定义一个列表:<class 'list'> y = iter(x) #创建一个可迭代对象:<class 'list_iterator'> #print(next(y)) # 1 #print(next(y)) # 2 #print(next(y)) # 3 #print(next(y)) # 迭代结束会后返回异常StopIteration错误 for i in y: print(i,end=" ") print() # 1 2 3
- 迭代对象:定义魔术方法:
__next__()
和__iter__()
class A: def __init__(self): self.x=0 def __next__(self): self.x += 1 if self.x>10: raise StopIteration return self.x def __iter__(self): return self a = A() print(list(a)) #for i in a: # print(i) # [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
END