zoukankan      html  css  js  c++  java
  • 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']
     
  • 相关阅读:
    五子棋人机对战设计
    通过getSystemServices获取手机管理大全
    C#常见错误解决方法
    🍖数据增删改查页面搭建
    🍖django ORM 表关系与django 请求生命周期流程图
    🍖django ORM 简介
    🍖Python与django连接数据库
    🍖静态文件配置与request对象
    开启进程的两种方式
    进程PID 与PPID
  • 原文地址:https://www.cnblogs.com/zhangan/p/10049798.html
Copyright © 2011-2022 走看看