python-38-用于面向对象的内置函数
Posted 广深-小龙 --扬帆起航!
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python-38-用于面向对象的内置函数相关的知识,希望对你有一定的参考价值。
前言
在面向对象中有很多内置方法,你会发现都很容易知道它的用处与平时用到的函数一样。
- 1、__str__
- 2、__repr__
- 3、__len__
- 4、__del__
- 5、__call__
- 6、item系列
- 7、__new__
- 8、__eq__
- 9、__hash__
1、__str__:一旦被调用,就返回调用这个方法的对象的内存地址。
# 1、__str__:一旦被调用,就返回调用这个方法的对象的内存地址 class A: def __init__(self,name):self.name=name def __str__(self): return \'A is object \'+self.name res = A(\'广深小龙\') print(res) # 打印一个对象,相当于调用了a.__str__ print(\'%s:%s\'%(\'A:\',res))
2、__repr__:
- repr(),只会找__repr__,如果没有找父类的,优先推荐repr。
- 如果没有__str__方法,会先找本类中的__repr__方法,再没有再找父类中的__str__。
- print(obj)/\'%s\'%obj/str(obj)的时候,实际上是内部调用了obj.__str__方法,如果str方法有,那么他返回的必定是一个字符串。
# 2、__repr__: class A: def __init__(self,name):self.name=name def __str__(self): return \'A is object \'+self.name def __repr__(self):return str(self.__dict__) res = A(\'广深小龙\') print(res) # 打印一个对象,相当于调用了a.__str__ print(\'%s:%s\'%(\'A:\',res)) print(repr(res))
3、__len__:内置方法有很多,可以定制自己的内置方法
# 3、__len__:内置方法有很多,可以定制自己的内置方法 class A: def __init__(self,name): self.name=[] def __len__(self): return len(self.name)+1 res=A(\'小龙龙\') res.name.append(\'广深小龙\') res.name.append(\'广深小龙\') print(len(res))
4、__del__:析构函数:
删除一个对象之前,进行一些收尾工作
# 4、__del__:析构函数 # 删除一个对象之前,进行一些收尾工作 class A: def __del__(self): print(\'执行我了\') a=A() del a # 既执行了del方法,也删除了变量a
5、__call__,调用能直接返回想要返回的功能,不用传方法名称:
# 5、__call__,调用能直接返回想要返回的功能,不用传方法名称 class A: def __init__(self,name):self.name=name def __call__(self, *args, **kwargs): print(self.__dict__) a=A(\'小龙龙\')() # 调用内部__call__方法
6、item系列:
①list:增删查改
# 1、list:增删查改 class A: def __init__(self,name):self.name=name def __getitem__(self, item): if hasattr(self,item): return self.__dict__[item] def __setitem__(self, key, value): self.__dict__[key]=value def __delitem__(self, key):del self.__dict__[key] a=A(\'广深小龙\') print(a[\'name\']) # 查 a[\'age\']=\'22\' # 增 print(a.age) a[\'age\']=\'55\' # 改 print(a[\'age\']) del a.name # 删 del a[\'age\'] print(a.__dict__)
7、__new__:构造方法
# 2、__new__:构造方法 class A: def __init__(self): print(\'init\') def __new__(cls, *args, **kwargs): # 会先执行__new__方法 print(\'__new__\') return object.__new__(A, *args, **kwargs) a = A() # 会先执行cls,object.__new__,再执行self的__init__
7-1、设计模式:单列模式
- 一个类只有一个实例,多个实例内存地址是一样。
- 当你第一次实例化这个类的时候 就创建一个实例化的对象。
- 当你之后再来实例化的时候 就用之前创建的对象。
class A: __res=False def __init__(self,name,age): self.name=name self.age=age def __new__(cls, *args, **kwargs): # 会先执行__new__方法 if cls.__res: return cls.__res cls.__res=object.__new__(A) return cls.__res a = A(\'广深小龙\',\'22\') b = A(\'小龙女\',\'18\') print(a) print(b) print(a.name) print(b.name) a.addr=\'广深\' print(b.addr) # a追加,但b也有。单列模式
8、__eq__:比较两个值,也是可定制处理。
# 8、__eq__:比较两个值,也是可定制处理 class A: def __init__(self,name): self.name=name def __eq__(self, other): if self.name==other.name: print(\'%s 就是等于 %s\'%(self.name,other.name)) return True else:False res1=A(\'gsxl\') res2=A(\'gsxl\') print(res1==res2) # 正常是不相等,但__eq__可以定制处理
9、__hash__:定制化将哈希函数。
# 9、__hash__:定制化将哈希函数 class A: def __init__(self,name,hname): self.name=name self.hname=hname def __hash__(self): return hash(self.name+self.hname) res1=A(\'gsxl\',\'2233\') res2=A(\'gsxl\',\'2233\') print(hash(res1)) print(hash(res2))
欢迎来大家QQ交流群一起学习:482713805 !!!
以上是关于python-38-用于面向对象的内置函数的主要内容,如果未能解决你的问题,请参考以下文章