30.面向对象中常用内建函数与重载函数丶自定义手动报错

 内建函数:类中特殊功能
  • __init__(self):      ###为实例对象赋值
     1,可以没有这个函数 实例没数据
     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如何能等于3
class 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)

运行结果:

3

2.字符串怎么样才能相减

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
bc

3.定义字符串长度是否相等

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']
 
posted on 2018-12-01 16:02  走路带风的帅界扛把子  阅读(189)  评论(0编辑  收藏  举报