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

简介: Python 魔术方法,属性,迭代器

魔术方法,属性,迭代器

岁月有你,惜惜相处

阅读本文需要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

    相关文章
    |
    1月前
    |
    索引 Python
    python-类属性操作
    【10月更文挑战第11天】 python类属性操作列举
    20 1
    |
    19天前
    |
    存储 程序员 数据处理
    深入理解Python中的生成器与迭代器###
    本文将探讨Python中生成器与迭代器的核心概念,通过对比分析二者的异同,结合具体代码示例,揭示它们在提高程序效率、优化内存使用方面的独特优势。生成器作为迭代器的一种特殊形式,其惰性求值的特性使其在处理大数据流时表现尤为出色。掌握生成器与迭代器的灵活运用,对于提升Python编程技能及解决复杂问题具有重要意义。 ###
    |
    1月前
    |
    存储 索引 Python
    Python 迭代器是怎么实现的?
    Python 迭代器是怎么实现的?
    31 6
    |
    2月前
    |
    索引 Python
    解密 Python 迭代器的实现原理
    解密 Python 迭代器的实现原理
    48 13
    |
    2月前
    |
    机器学习/深度学习 设计模式 大数据
    30天拿下Python之迭代器和生成器
    30天拿下Python之迭代器和生成器
    20 3
    |
    1月前
    |
    存储 大数据 Python
    Python 中迭代器与生成器:深度解析与实用指南
    Python 中迭代器与生成器:深度解析与实用指南
    18 0
    |
    2月前
    |
    存储 API 索引
    让 Python 的属性查找具有 C 一级的性能
    让 Python 的属性查找具有 C 一级的性能
    16 0
    |
    2月前
    |
    Python
    Python中类属性与实例属性的区别
    了解这些区别对于编写高效、易维护的Python代码至关重要。正确地使用类属性和实例属性不仅能帮助我们更好地组织代码,还能提高代码运行的效率。
    27 0
    |
    2月前
    |
    Python
    Python类中属性和方法区分3-8
    Python类中属性和方法区分3-8
    |
    3月前
    |
    数据采集 存储 大数据
    Python关于迭代器的使用
    在Python编程中,数据的处理和操作是核心任务之一。 想象一下,你有一个装满各种颜色球的箱子,你想逐个查看并使用这些球,但又不想一次性将它们全部取出。 这就引出了我们今天要讨论的主题——迭代。
    下一篇
    无影云桌面