Python基础刻意练习:魔方方法

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 = name
        self.age = age

tom = 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 = world

    def __getattribute__(self, item):
        print 'get_something: %s' % item
        return item


x = 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值