前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python 魔术方法,属性,迭代器

Python 魔术方法,属性,迭代器

作者头像
Python知识大全
发布2020-02-13 15:01:16
5690
发布2020-02-13 15:01:16
举报
文章被收录于专栏:Python 知识大全

魔术方法,属性,迭代器

岁月有你,惜惜相处

阅读本文需要5分钟

1.13.1 魔术方法:
  • 在Python中的面向对象中有很多魔术方法如:
代码语言:javascript
复制
 __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__函数用于处理打印实例本身的时候的输出内容。如果没有覆写该函数,则默认输出一个对象名称和内存地址。
代码语言:javascript
复制
class Stu:
  name= '张三'
  age = 20
  def __str__(self):
    return "姓名:%s; 年龄:%d"%(self.name,self.age)

s = Stu()
print(s)

姓名:张三; 年龄:20
  • 析构魔术方法,当对象从内存被释放前调用的方法,目的是做一些释放销毁工作。
代码语言:javascript
复制
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
代码语言:javascript
复制
# 输出
create demo... 1
create demo... 2
create demo... 3
del demo.... 3
del demo.... 1
del demo.... 2
  • __add__: 加运算
代码语言:javascript
复制
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() 函数的作用是在新式类中返回属性值
代码语言:javascript
复制
* ```class property([fget[, fset[, fdel[, doc]]]])```
* fget -- 获取属性值的函数
* fset -- 设置属性值的函数(可选)
* fdel -- 删除属性值函数(可选)
* doc -- 属性描述信息(可选)
代码语言:javascript
复制
# 定义一个矩形类,假象有一个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)
  • 对应上面的实例,
代码语言:javascript
复制
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装饰器
代码语言:javascript
复制
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()
代码语言:javascript
复制
# 输出
这是一个静态方法
这是一个类成员方法 <class '__main__.MyClass1'>
这是一个静态方法
这是一个类成员方法 <class '__main__.MyClass2'>
  • 使用hasattr()函数判读对象中是否存在指定的非私有属性和方法:
代码语言:javascript
复制
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() )
代码语言:javascript
复制
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__()
代码语言:javascript
复制
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]

1

END

发现更多精彩

关注公众号

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-08-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python 知识大全 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.13.1 魔术方法:
  • 1.13.2 属性和方法
    • property() 函数的作用是在新式类中返回属性值
      • 静态方法和类成员方法(区别是有无带参数)
      • 1.13.3 迭代器:
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档