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

    相关文章
    |
    11天前
    |
    物联网 Python
    请问:如何使用python对物联网平台上设备的属性进行更改?
    为验证项目可行性,本实验利用阿里云物联网平台创建设备并定义电流、电压两个整型属性。通过Python与平台交互,实现对设备属性的控制,确保后续项目的顺利进行。此过程涵盖设备连接、数据传输及属性调控等功能。
    |
    1月前
    |
    存储 数据处理 Python
    Python如何显示对象的某个属性的所有值
    本文介绍了如何在Python中使用`getattr`和`hasattr`函数来访问和检查对象的属性。通过这些工具,可以轻松遍历对象列表并提取特定属性的所有值,适用于数据处理和分析任务。示例包括获取对象列表中所有书籍的作者和检查动物对象的名称属性。
    34 2
    |
    2月前
    |
    大数据 数据处理 开发者
    Python中的迭代器和生成器:不仅仅是语法糖####
    本文探讨了Python中迭代器和生成器的深层价值,它们不仅简化代码、提升性能,还促进了函数式编程风格。通过具体示例,揭示了这些工具在处理大数据、惰性求值及资源管理等方面的优势。 ####
    |
    3月前
    |
    索引 Python
    python-类属性操作
    【10月更文挑战第11天】 python类属性操作列举
    37 1
    |
    3月前
    |
    存储 索引 Python
    Python 迭代器是怎么实现的?
    Python 迭代器是怎么实现的?
    53 6
    |
    2月前
    |
    存储 程序员 数据处理
    深入理解Python中的生成器与迭代器###
    本文将探讨Python中生成器与迭代器的核心概念,通过对比分析二者的异同,结合具体代码示例,揭示它们在提高程序效率、优化内存使用方面的独特优势。生成器作为迭代器的一种特殊形式,其惰性求值的特性使其在处理大数据流时表现尤为出色。掌握生成器与迭代器的灵活运用,对于提升Python编程技能及解决复杂问题具有重要意义。 ###
    |
    4月前
    |
    索引 Python
    解密 Python 迭代器的实现原理
    解密 Python 迭代器的实现原理
    54 13
    |
    4月前
    |
    机器学习/深度学习 设计模式 大数据
    30天拿下Python之迭代器和生成器
    30天拿下Python之迭代器和生成器
    24 3
    |
    3月前
    |
    存储 大数据 Python
    Python 中迭代器与生成器:深度解析与实用指南
    Python 中迭代器与生成器:深度解析与实用指南
    26 0
    |
    4月前
    |
    存储 API 索引
    让 Python 的属性查找具有 C 一级的性能
    让 Python 的属性查找具有 C 一级的性能
    26 0