当前位置:   article > 正文

Python从入门到实践:面向对象之内置方法(七)_python 面向对象的内置方法

python 面向对象的内置方法

Python的Class机制内置了很多特殊的方法来帮助使用者高度定制自己的类,这些内置方法都是以双下划线开头和结尾的,会在满足某种条件时自动触发。

1.__str__

str_方法会在对象被打印时自动触发,print功能打印的就是它的返回值,我们通常基于方法来定制对象的打印信息,该方法必须返回字符串类型

  1. >>> class People:
  2. ... def __init__(self,name,age):
  3. ... self.name=name
  4. ... self.age=age
  5. ... def __str__(self):
  6. ... return '<Name:%s Age:%s>' %(self.name,self.age) #返回类型必须是字符串
  7. ...
  8. >>> p=People('lili',18)
  9. >>> print(p) #触发p.__str__(),拿到返回值后进行打印
  10. <Name:lili Age:18>

2.__del__(析构函数)

del_会在对象被删除时自动触发。由于Python自带的垃圾回收机制会自动清理Python程序的资源,所以当一个对象只占用应用程序级资源时,完全没必要为对象定制_del_方法,但在产生一个对象的同时涉及到申请系统资源(比如系统打开的文件、网络连接等)的情况下,关于系统资源的回收,Python的垃圾回收机制便派不上用场了,需要我们为对象定制该方法,用来在对象被删除时自动触发回收系统资源的操作

  1. class MySQL:
  2. def __init__(self,ip,port):
  3. self.conn=connect(ip,port) # 伪代码,发起网络连接,需要占用系统资源
  4. def __del__(self):
  5. self.conn.close() # 关闭网络连接,回收系统资源
  6. obj=MySQL('127.0.0.1',3306) # 在对象obj被删除时,自动触发obj.__del__()

3.__init__

init()方法 当使用类名()创建对象时,Python解释器会自动执行以下操作:

A.为对象在内存中分配空间 创建对象

B.调用初始化方法为对象的属性设置初始值-初始化方法(init)

C.这个初始化方法是对象的内置方法,是专门用来定义一个类具有哪些属性的方法

4.__getattr__、__setattr__、__delattr__

之前介绍反射的时候说过,但是,这里有些许不同,内置方法里面没有hasattr

当使用obj.x = y的时候触发对象的setattr方法,当del obj.x的时候触发对象的delattr方法。
当尝试访问对象的一个不存在的属性时 obj.noexist 会触发getattr方法,getattr方法是属性查找中优先级最低的。
可以重写这3个方法来控制对象属性的访问、设置和删除
**特别注意:如果定义了getattr,而没有任何代码(即只有pass),则所有不存在的属性值都是None而不会报错,可以使用super().__getattr__()方法来处理**

  1. class Student:
  2. def __getattr__(self, item):
  3. print('访问一个不存在的属性时候触发')
  4. return '不存在'
  5. def __setattr__(self, key, value):
  6. print('设置一个属性值的时候触发')
  7. # self.key = value # 这样会无限循环
  8. self.__dict__[key] = value
  9. def __delattr__(self, item):
  10. print('删除一个属性的时候触发')
  11. if self.__dict__.get(item, None):
  12. del self.__dict__[item]
  13. stu = Student()
  14. stu.name = 'zlw' # 设置一个属性值的时候触发
  15. print(stu.noexit) # 访问一个不存在的属性时候触发 , 返回'不存在'
  16. del stu.name # 删除一个属性的时候触发

5.__iter__、__next__

这2个方法用于将一个对象模拟成序列。内置类型如列表、元组都可以被选代,文件对象也可以被选代获取每一行内容。重写这两个方法就可以实现自定义的选代对象。

  1. class MyRange():
  2. def __init__(self,begin,end,step):
  3. self.begin=begin
  4. self.end=end
  5. self.step=step
  6. self.count=0
  7. def __iter__(self):
  8. return self
  9. def __next__(self):
  10. if self.begin <self.end:
  11. self.count=self.begin
  12. self.begin=self.begin+self.step
  13. return self.count
  14. else:
  15. raise StopIteration('已经到达临界')
  16. if __name__=='__main__':
  17. ra=MyRange(1,20,3)
  18. for item in ra:
  19. print(item)

----------------------------------------------------------------------------------------

6.item类和__len__

在深度学习中,我们在封装dataset的时候,一定会重写的两个内置方法,非常重要!!

  1. class Person:
  2. def __getitem__(self,key): # 获取
  3. return self.__dict__[key]
  4. def __setitem__(self,key,value): #设置
  5. self.__dict__[key] = value
  6. def __delitem__(self,key): #删除
  7. self.__dict__.pop(key)
  8. p = Person()
  9. p['a'] = 1
  10. print(p['a'])
  11. del p['a']
  12. print(p['a']) #这里会报KeyError
  1. #使用len()时执行
  2. class Life:
  3. def __init__(self,name,length):
  4. self.name = name
  5. self.length = length
  6. def __len__(self):
  7. return self.length
  8. hsr = Life('hsr',100)
  9. print(len(hsr))

7.__hash__

hash()用于获取一个对象(字符串、数字、对象)的哈希值,不能直接作用于list、set、dict

在hash()最用对象时,所得的结果不仅和对象的内容有关,还和对象的id(),也就是内存地址相关。

hash() 函数的对象字符不管有多长,返回的 hash 值都是固定长度的,也用于校验程序在传输过程中是否被第三方(木马)修改,如果程序(字符)在传输过程中被修改hash值即发生变化,如果没有被修改,则 hash 值和原始的 hash 值吻合,只要验证 hash 值是否匹配即可验证程序是否带木马(病毒)。

  1. #对对象进行hash运算
  2. class Student:
  3. def __init__(self,no,name):
  4. self.no = no
  5. self.name = name
  6. def __hash__(self):
  7. return hash(str(self.no)+self.name)
  8. s = Student(102302,'hsr')
  9. print(hash(s))

8.__eq__

  1. class Life:
  2. def __init__(self,name,length):
  3. self.name = name
  4. self.length = length
  5. def __len__(self):
  6. return self.length
  7. def __eq__(self, other):
  8. return other.length == self.length #重写后,判断的是长度是否相等,如果不重写,因为地址不一样,就不相等
  9. hsr = Life('hsr',100)
  10. ttt = Life('ttt',100)
  11. print(hsr == ttt)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/运维做开发/article/detail/762008
推荐阅读
相关标签
  

闽ICP备14008679号