30.面向对象中常用内建函数与重载函数丶自定义手动报错
内建函数:类中特殊功能
- __init__(self): ###为实例对象赋值
2,数据初始化函数
3,在实例化时,自动调用
4,init函数只能返回None ###TypeError: __init__() should return None, not 'int'
class A(object): def __init__(self): #init自动调用 print('我是init') self.num = 1 a = A()运行结果:
我是init
- __new__(self): ###创建实例对象,简称构造器
1,在init函数之前调用,自动调用
2, 初始化实例内存空间,创建一个壳子
3, 必须要返回一个实例对象
class A(object): def __new__(self): #创建实例对象,构造器 new函数是可以不写的,面向对象默认自带 print('我是new') return super(A,self).__new__(self) #new函数必须要返回一个实例对象 def __init__(self): #为实例对象赋值 print('我是init') self.num = 1 a = A()运行结果:
我是new 我是init
-
__del__(self): ###拆除释放掉骨架,简称析构器 (一般来说可以不定义,因为内存便宜了,优秀的程序员想要写的更好就可以用这个函数释放一下内存,就算不写也不会影响什么,除非你的数据比较大几百兆甚至更多)
1,在对象释放的时候 自动调用
2,用来释放数据内存
class A(object): def __new__(self): #创建实例对象,构造器 默认是可以不写的 print('我是new') return super(A,self).__new__(self) #new函数必须要返回一个实例对象 def __init__(self): #为实例对象赋值 print('我是init') self.num = 1 def __del__(self): del self.num print('我是del,数据内存释放完毕') a = A()运行结果:
我是new 我是init 我是del,数据内存释放
- __slots__ = ('name','age')
1,定义当前的实例属性可以有那些,如果不是定义的就会报错:AttributeError: 'A' object has no attribute 'name1'
class A(object): def __init__(self): #为实例对象赋值 self.age = 20 self.name = '小红' print('我是%s,今年%s岁' % (self.name,self.age)) __slots__ = ('age','name') a = A()运行结果:
我是小红,今年20岁
重载这些内建函数:运算符内建函数
-
继承重写:运算符 (记住要时刻要用dir函数查看内建函数,help查看函数的帮助文档)
1, +:__add__
2, -:__sub__
3, *:__mul__
4, /:__floordiv__
5, == : __eq__
6, > : __gt__
7,>= :__ge__
8,< : __lt__
9,<= : __le__
1,1+1如何能等于3class Mayint(int): ''' __add__(self, value, /) Return self+value. ''' def __add__(self,value): #这里操作的是把add函数重写了 print('self:',self) print('value:',value) return super(Mayint,self).__add__(value) + 1 a = Mayint(1) b = Mayint(1) print(a+b)运行结果:
32.字符串怎么样才能相减
class Maystr(str): ''' __sub__(self, value, /) Return self-value. ''' def __sub__(self,value): print(self) print(value) return self.replace(value,'') a = Maystr('abca') b = Maystr('a') res = a - b print(res)运行结果:
abca a bc3.定义字符串长度是否相等
class Maystr(str): ''' __eq__(self, value, /) Return self==value. ''' def __eq__(self,value): if len(str(self)) == len(str(value)): return True else: return False a = Maystr(11) b = Maystr(10) print(a == b)运行结果:
True
-
继承重写:操作符
1,__getitem__:__getitem__(self,index)
self.__getitem__(index) <==> self[index]2,__setitem__:__setitem__(self, key, value, /)
Set self[key] to value.#更改索引值从1开始 class MyIndexError(Exception): #自定义报错 pass class MyList(list): def __getitem__(self,index): #[] ''' 1: 就是开始 ''' #print('self:',self) #print('index:',index) if index > 0: return super(MyList,self).__getitem__(index-1) # elif index < 0: return super(MyList,self).__getitem__(index) else: raise IndexError('请不要输入0,这个数据不支持0位置索引访问') #raise 手动抛出异常 def __setitem__(self,key,value): #print('key:',key) #index #print('value:',value) #赋的值 if key == 0: raise IndexError('请不要输入0,这个数据不支持0位置索引访问') if key > 0: super(MyList,self).__setitem__(key-1, value) if key < 0: super(MyList,self).__setitem__(key, value) a = MyList(['a','b','c']) print(a[3]) a[3] = '1' #1索引从1开始 print(a)运行结果:
c ['a', 'b', '1']
作者:走路带风的帅界扛把子
本文版权归作者和博客园共有,欢迎转载,但必须给出原文链接,并保留此段声明,否则保留追究法律责任的权利。