task11

Python的对象天生拥有一些神奇的方法,它们总是被双下划线包围,它们是面向对象的Python的一切。






下面针对几个常用的魔方方法来展开:

1.—str—和—repr—

__str__相当于是str()方法, 而__repr__相当于repr()方法。str是针对于让人更好理解的字符串格式化,而repr是让机器更好理解的字符串格式化。

其实获得返回值的方法也很好测试,在我们平时使用ipython的时候,在不使用print直接输出对象的时候,通常调用的就是repr方法,这个时候改写repr方法可以让他方便的输出我们想要知道的内容,而不是一个默认内容。
eg:

class Student(object):def _init_(self,value='hello,world!'):self.data=value>>> t=Student()
>>> t
<__main__.Student object at 0x0000020F3E853460>
>>> print(t)
<__main__.Student object at 0x0000020F3E853460>
>>> class StudentRepr(Student):def _repr_(self):return 'StudentRepr(%s)'%self.data>>> tr=StudentRepr()
>>> tr
>>> print(tr)
>>> StudentRepr(hello,world)
>>> class StudentStr(Student):def _str_(self):return '[Value:%s]'%self.data>>> ax=StudentStr()
>>> ax
>>> print(ax)


2.—hash—和—dir—

eg:

>>> name1="正常程序代码"
>>> name2="正常程序代码带病毒"
>>> print(hash(name1))
>>> print(hash(name2))


dir() 函数不带参数时,返回当前范围内的变量、方法和定义的类型列表;带参数时,返回参数的属性、方法列表。如果参数包含方法__dir__(),该方法将被调用。如果参数不包含__dir__(),该方法将最大限度地收集参数信息。
dir 语法:
dir([object])
参数说明:object – 对象、变量、类型。
返回模块的属性列表。
eg:

>>> dir()
>>> dir([])

3.关于控制参数访问的__getattr__, setattr, delattr, getattribute:

getattr

[作用:返回object的名称为name的属性的属性值,如果属性name存在,则直接返回其属性值;如果属性name不存在,则触发AttribetError异常或当可选参数default定义时返回default值。]:

>>> class Test(object):a=1
>>> Test.a
>>> getattr(Test,'a')
>>> getattr(Test,'a',4)
>>> getattr(Test,'b',4)

setattr

是设置参数的时候会调用到的魔法方法,相当于设置参数前的一个钩子。每个设置属性的方法都绕不开这个魔法方法,只有拥有这个魔法方法的对象才可以设置属性。在使用这个方法的时候要特别注意到不要被循环调用了。
eg:

class Dict(dict):def _setattr_(self,key,value):self[key]=value
>>> d=Dict(a=2,b=4)
>>> print(d['a'])
>>> print(d.a)
>>> d.a=100
>>> print(d['a'])

delattr

__delattr__的行为和__setattr__特别相似,同样需要注意的也是循环调用问题,其他都差不多,只是把属性赋值变成了 del self.name这样的表示。delattr(object, name)
eg:

class Person:def __init__(self, name, age):self.name = nameself.age = agetom = Person("Tom", 35)
print dir(tom)
delattr(tom, "age")
print dir(tom)
#['__doc__', '__init__', '__module__', 'age', 'name']['__doc__', '__init__', '__module__', 'name']

getattribute

__getattribute__和__getattr__方法唯一不同的地方是,上面我们已经介绍了__getattr__方法只能在找不到属性的时候拦截调用,然后进行重载或者加入一些其他操作。但是__getattribute__更加强大,他可以拦截所有的属性获取。所以也容易出现我们上面提到的,循环调用的问题。
eg:

class Test(object):def __init__(self, world):self.world = worlddef __getattribute__(self, item):print 'get_something: %s' % itemreturn itemx = Test(123)
print x.world
print x.ppoutput:get_something: worldworldget_something: pppp

可以看到,区别于__getattr__只拦截不存在的属性,__getattribute__会拦截所有的属性。所以导致了已经被初始化的world值123,也被改写成了字符串world。而不存在的属性也被改写了成了pp。

以上就是我整理的task11的全部内容,感谢你的浏览。
参考文献:
https://www.cnblogs.com/piperck/p/6354263.html
https://www.cnblogs.com/seablog/p/7173107.html
https://blog.csdn.net/qq_33385691/article/details/80911750
https://blog.csdn.net/JNingWei/article/details/78365284

Python基础刻意练习:魔方方法相关推荐

  1. python基础刻意练习-day15

    python基础刻意练习-day15 魔方方法 魔方方法总是被双下划线包围,例如_int_ 简单定制 基本要求: 1.定制一个计时器的类 2.start和stop方法代表启动计时和停止计时 3.假设计 ...

  2. Python基础编程——多重继承下方法的调用

    我们介绍了在继承下面调用父类的构造方法,那么在多重继承下如何调用父类的方法呢?虽然在使用多重继承时需要慎重,但是在实际的项目开发中多重继承却随处可见,因此了解多重继承下调用父类的方法也是很有必要的. ...

  3. Python基础教程:绑定方法和非绑定详细用法

    绑定和方法调用 1.首先,方法仅仅是类内部定义的函数.(这意味着方法是类属性而不是实例属性) 2.其次,方法只有在其所属的类拥有实例时,才能被调用.当存在一个实例时,方法才被认为是绑定到那个实例了.没 ...

  4. Python基础教程:super()方法详解

    一.单独调用父类的方法 需求:编写一个类,然后再写一个子类进行继承,使用子类去调用父类的方法1. 使用方法1打印: 胖子老板,来包槟榔. 那么先写一个胖子老板的父类,执行一下: class FatFa ...

  5. Python基础教程 os.walk()方法

    os.walk方法,主要用来遍历一个目录内各个子目录和子文件. os.walk(top, topdown=True, onerror=None, followlinks=False) 可以得到一个三元 ...

  6. python基础学习——函数和方法的区别与联系

    以下是综合多家说法的个人理解总结,仅为做到理解它们的区别与联系,不保证严谨. 函数 函数是封装了一些独立的功能,可以直接调用,python内置了许多函数,同时可以自建函数来使用. 独立的函数是函数(像 ...

  7. python基础之类的属性方法、魔术方法普通方法

    类的定义.调用方法.引用属性 类的属性和方法 类的属性 类属性的访问 类属性可以直接访问,无需实例化 类属性也可以通过实例来访问 实际上,所有的实例是共享类属性的 类属性的修改 修改了类属性后,对应的 ...

  8. Python基础刻意练习:字典与集合

    本系列定位为复习笔记,某些内容并未提及. 在此记录一些典型疑问和我在学习中的问题或经常遗忘的细节,也会添加一些觉得有意思的部分(其实就是随心所欲 ) 内容主要使用代码进行传达 字典(哈希表)的创建与索 ...

  9. python类中的魔方方法

    在python中有些方法名比较特别,在名称的前后各有两个下划线,这样的方法往往具有特殊的意义,一般情况下我们不会直接用到所以称之为"隐藏方法"也有一些人称之为"魔法方法& ...

最新文章

  1. 使用GIF(仅限Delphi2007)
  2. 面对疫情,在家办公的程序员如何突围
  3. XCode删除多余的Simulator(模拟器)
  4. ffmpeg rtsp转 rtmp
  5. 奇妙的棋盘(建图+搜索)
  6. 【工具类】手动获取被spring管理的bean对象
  7. 【C语言】第七章 模块化与函数 题解
  8. 浏览器安全与MSAA
  9. 4g网络设置dns地址_黑群晖nas中tr软件汉化、路由器设置端口转发教程(二)
  10. 基于react的简单TODOList
  11. MapReduce:详解Shuffle过程
  12. 获取Linux服务器信息脚本
  13. DriverFinder(电脑驱动升级软件)官方正式版V4.1.0.0 | 最好的电脑驱动软件之一 | win10更新驱动用什么软件
  14. 电子技术基础(三)_第4章直流稳压电源__集成稳压器
  15. 【无标题】学生成绩管理系统
  16. 【软件测试】python完成接口测试示例
  17. 不只是A/B测试:多臂老虎机赌徒实验
  18. 自己动手写搜索引擎(常搜吧历程三#搜索#)(Java、Lucene、hadoop)
  19. Linux运维18:网络和监控
  20. 电机保护器ARD3T 过载、断相、不平衡、欠载、接地/漏电、堵转等保护功能

热门文章

  1. 数据库(MySQL + Redis)
  2. 富文本编辑器wangEditor回显问题
  3. How to Pronounce PROBABLY
  4. 【c++并发编程】pthread_create的使用
  5. 后台管理系统日志(一个小插曲)
  6. PTA(三十)面向对象程序设计 第五章 作业 7-1 复数的比较 (30 point(s))
  7. C#实现发送和接收邮件的winform邮箱(保存至MySQL本地数据库)Mail Client
  8. 5.询问姓名及电话号码
  9. 经典卷积神经网络(CNN)图像分类算法详解
  10. 图片转JPG格式怎么转换