属性访问

通常可以通过点(.)操作符的形式去访问对象的属性,关于属性的访问,也有相应的魔法方法来管理,

属性相关的魔法方法

魔法方法

含义

__getattr__(self,name)

定义当用户试图获取一个不存在的属性的行为

__getattribute__(self,name)

定义当该类的属性被访问时的行为

__setattr__(self,name,value)

定义当一个属性被设置时

__delattr__(self,name)

定义一个属性被删除时

例子

class C:    def __getattribute__(self,name):#当该类的属性被访问的行为        print('getattribute')        return super().__getattribute__(name)        def __setattr__(self,name,value):#当一个属性被设置时        print('setattr')        super().__setattr__(name,value)            def __delattr__(self,value):#当一个属性被删除        print('delattr')        super().__delattr__(name)            def __getattr__(self,name):#当用户获取一个不存在的上述属性        print('getattr')

运行后

>>> c = C()>>> c.xgetattributegetattr>>> c.x = 1setattr>>> c.xgetattribute1>>> del c.xdelattr

上面的几个魔法方法可能会造成死循环

看例子

要求;写一个矩形类(Rectangle),默认有宽和高两个属性,如果为一个叫做square的属性赋值,那么说明是个正方形,值就是正方形的边长,此时宽高都应等于边长

class Rectangle:    def __init__(self,width = 0,height = 0):        self.width = width        self.height = height    def __setattr__(self,name,value):        if name == 'square':            self.width = value            self.height = height        else:            self.name = value    def getArea(self):        return self.width * self.height

不妨粘在电脑里运行一下

分析原因,其实就是调用__init__时,不断地去触发__setattr__方法,造成了死循环

更改

class Rectangle:    def __init__(self,width = 0,height = 0):        self.width = width        self.height = height    def __setattr__(self,name,value):        if name == 'square':            self.width = value            self.height = height        else:            self.__dict__[name] = value    def getArea(self):        return self.width * self.height

运行

>>> r1 = Rectangle(4,5)>>> r1.getArea()20

迭代器

还记得迭代吗?

这篇介绍下

迭代类似于循环,每一次充分的过程被称为一次迭代

如序列(列表,元组,字符串),还有字典,都支持迭代操作

复习一下

>>> for i in 'tianjun':...     print(i)...tianjun>>>

字符串相当一个容器,也同时是个迭代器,for语句的作用介绍触发这个迭代器的迭代功能,每次拿出一个数据,就是迭代操作

关于迭代

Python有两个BIF

重点

iter()

next()

对一个容器对象调用iter就是得到他的接待器,调用next迭代器觉慧返回下一个值

如果一个容器是迭代器,那就必须调用iter方法,这个方法实际是就是返回迭代器本身,然后是实现的是next()魔法方法,因为它决定了迭代的规则,如下

用迭代器写的裴波那切数列:

class Fibs:      def __init__(self,n = 10):          self.a = 0          self.b = 1          self.n = n      def __iter__(self):         return self           def __next__(self):                 self.a,self.b = self.b,self.a+self.b         if self.a > self.n:             raise StopIteration         return self.a

生成器、什么是生成器

通过列表生成式,我们可以直接创建一个列表,但是,受到内存限制,列表容量肯定是有限的,而且创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。 所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间,在Python中,这种一边循环一边计算的机制,称为生成器:generator

继续使用import sys斐波那契

 def fibonacci(n):     a, b, counter = 0, 1, 0    while True:        if (counter > n):             return        yield a        a, b = b, a + b        counter += 1f = fibonacci(10) # f 是一个迭代器,由生成器返回生成 while True:    try:        print (next(f), end=" ")    except StopIteration:        sys.exit()

输出

0 1 1 2 3 5 8 13 21 34 55

本文分享自微信公众号 - 渗透云笔记(shentouyun),作者:天钧

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-06-16

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • ics渗透中你总会用到-穿透工业隔离网闸

    程序以python编写,可以透过Modbus / TCP通讯协定传送任意以太网流量。它可以帮助安全研究人员顺利规避针对工业协议剥离类型的防火墙。

    天钧
  • 继承(第十三章)

    嗯哼哼?其实就相当于就用,继承者相当于子类,pass是什么,空的意思方便大家理解,官方点就是占位符

    天钧
  • 爆破cobalt strike密码脚本

    无聊的我又来水文了,今天的是爆破cobalt strike密码脚本,最近活脱脱成了一个GITHUB的安(搬)利(运)管(工)。其余时间都是在写作业

    天钧
  • 【项目实践】中英文文字检测与识别项目(CTPN+CRNN+CTC Loss原理讲解)

    文字识别也是图像领域一个常见问题。然而,对于自然场景图像,首先要定位图像中的文字位置,然后才能进行文字的识别。

    OpenCV学堂
  • Python 学习入门(36)—— @property属性

    @property 可以将python定义的函数“当做”属性访问,从而提供更加友好访问方式,但是有时候setter/getter也是需要的

    阳光岛主
  • 散列表结构 字典与集合

    散列表(Hash Table)结构是字典(Dictionary)和集合(Set)的一种实现方式。散列算法的作用是尽可能快地在数据结构中找到一个值。在散列表上插入...

    py3study
  • python3 函数迭代器

    迭代器协议,是指对象(实例)能够使用next函数获取下一项数据,在没有下一项数据之前触发一个StopIteration异常来终止迭代

    py3study
  • Day22psutil&图形界面

    psutil 用Python来编写脚本简化日常的运维工作是Python的一个重要用途。 在Python中获取系统信息的一个好办法是使用psutil这个第三方模...

    林清猫耳
  • python的tkinter编程(九)Text多行文本框的详细解读

    一天不写程序难受
  • bs4爬虫实战三:获取电影信息并存入mysql数据库

    这次爬虫的目标网站是:http://dianying.2345.com,爬虫的搜索目标仅限于今年的电影,在网站打开搜索,在年代中选择2018

    py3study

扫码关注云+社区

领取腾讯云代金券