• python进阶02 特殊方法与特殊属性


    python进阶02 特殊方法与特殊属性

    一、初始化、析构

      1、初始化

    # python中有很多双下划线开头且以下划线结尾的固定方法,它们会在特定的时机被触发执行,这便是特殊方法
    # 在实例化的时候就进行初始化,这样做的意义类似于:一个孩子出生就有性别,而不是出生以后再给他一个性别。这便是__init__的由来。
    class Account:
        def __init__(self,name,number,balance):
            self.name=name
            self.number=number
            self.balance=balance
    
    a=Account('Tuple','123456',8888) #在实例化的时候直接初始化a的对象
    #__init__参数传递过程:实例化产生一个类的实例---->python自动调用实例.__init__(参数)---->转换为类.init(实例,参数)

      2、析构

        对象被销毁

    my_list=[1,2,3,4]
    
    your_list=my_list
    
    my_list is your_list #True ,my_list = your_list
    
    #del 删除一个变量的指向,并且清除这个变量
    
    del my_list  #并不是直接删除这个列表对象,而是这个变量的指向,单your_list仍然指向这个列表,所以这个变量对象并没有被销毁。
    
    #垃圾回收:基于指向计数的垃圾回收,当还有东西指向对象的时候,这个对象就不会被销毁,否则才会被销毁

        析构__del__

    class Account:
        def __init__(self,name,number,balance):
            self.name=name
            self.number=number
            self.balance=balance
        
        def __del__(self): #当对象被销毁的时候,也就是当变量的指向计数为0的时候回自动触发这个函数
            print(self.name,'被销毁了')
    #再来个栗子
    class Account:
        all_accounts={} #在类中维持一个字典,存放所有账户
    
        def __init__(self,name,number,balance):
            self.name=name
            self.number=number
            self.balance=balance
            self.all_accounts[number]=self #实例化的时候就记录下这个账户
    
        def __del__(self):
             print(self.name,'被销毁了')
    
    #若实例的指向全被删除时,仍然不会触发del函数,原因是在类中还有个指向在
    #类似于你在银行开户了,结果你去销户的时候银行没把你的资料销掉,在银行中还有你的一份资料 

        通常会通过析构完成什么任务:1、提示开发者,对象被销毁了,方便调试;2、进行一些必要的清理工作

    二、字符串表示

    class Account:
    
        def __init__(self,name,number,balance):
            self.name=name
            self.number=number
            self.balance=balance
    
        def __del__(self):
             print(self.name,'被销毁了')
    
        def __str__(self):#向使用者提供尽可能简介且有用的信息
            return '{name}:{balance}'.format(name=self.name,balance=self.balance)
    
        def __repr__(self):#向开发者提供接近创建时的信息
            return '{name}:{balance}'.format(name=self.name,balance=self.balance)
    
    
    a=Account('Tuple','123456',8888)
    
    print(str(a)) #输出 Tuple:8888   简介,有用;只要是在代码里面通过print用的
    print(repr(a))#输出 Account('Tuple','123456',8888)  接近创建;只要是在shell里面直接用的
    
    print(a) #Tuple:8888 ,如果没有上述函数,输出的只会是内存地址
    
    
    #print函数会输出__str__的返回值。如果没有定义__str__,会输出__repr__的返回值。在shell模式下展示__repr__的返回值,不会去找__str__

    #总结
    #str会自动触发__str__;repr会自动触发repr;print--->__str__;交互模式 __repr__;如果没有定义__str__,但是使用了str或repr也会触发__repr__
    #如何抉择
    str    #尽可能的提供简洁且有用的信息,让用户尽可能吸收到必要的信息
    repr   #尽可能向开发者提供创建该对象时的必要信息,让开发者可以直接通过复制粘贴来重建对象。

    三、“属性操作”内置函数

    getattr(object, ’name’[, default])    #查询类中是否有name这个属性,没有就返回default
    
    hasattr(object, ’name’) #查询类中是否有name这属性,输出True或者False;除此之外,hasattr还可以避免因为属性没有而导致的报错
    
    setattr(object, ’name’, value)#自动转换成object.name=value,可以覆盖
    
    delattr(object, ’name’)#删除类中object.name这个属性
    
    class MyClass:
        pass
    
    i=MyClass()
    
    i.name='Tuple'
    
    value=getattr(i,'xxx',sss) #前面2个自动转换成i.xxx,若没有则输出sss
    print(value) #输出 sss
    
    value=hasattr(i,'xxx')
    print(value) #输出False,表示i没有xxx这个属性
    
    value=getattr(i,'name',sss) 
    print(value)#输出i.name=sss
    
    value=delattr(i,'name') #删除i.name这个属性
    print(value) #报错,因为没有这个属性
    #意义
    #在程序运行的时候再决定类中的属性得什么,针对的是变量空间

    四、特殊方法

       特殊方法           简单描述
    __name__            类、函数、方法或生成器的名字
    __class__           一个类实例所属的类
    __doc__             文档字符串
    __dict__             储存了对象属性的字典
    def dance():
        pass
    
    print(dance) #没有调用的函数对象
    print(dance.__name__) #函数名叫dance,通过这个看一个函数,类的名字
    #Web开发 写路由的时候会用到__name__,网址和函数一一对应
    
    
    
    class A:
        pass
    
    b=A()
    print(b.__class__) #通过实例来得到类,而不是类名。类名是一个字符串,类是这个对象本身,也可以通过b.__class__()再来一个实例
    
    
    
    
    def dib(n):
        '''
        这个是斐波那契数列的计算函数
        :param n  :第n项
        :return :第n项的值
        '''
        if n==1:
            return 1# 第一项是1
        if n==2:
            return 1#第二项是1
        return fib()n-1+fib(n-2) #第n项是第n-1项+n-2项
    
    print(fib.__doc__) #输出:
        这个是斐波那契数列的计算函数
        :param n  :第n项
        :return :第n项的值
    
    
    
    class A:
        def xxx(self):
            pass
    
    a=A()
    a.name='Tuple'
    
    print(a.__dict__)#{'name':'Tuple'}把变量空间a封装的变量以字典形式显示出来
    print(A.__dict__)#输出整个类的封装内容

    五、解答课

      1、shell输出与 print输出的区别

    #print是什么? 是内置函数
    #有没有返回值? 有 返回值是None   None在控制台是不会打印出东西的
    
    #以下是在控制台(shell)运行的
    
    class A:
        def __str__(self):
            renturn 'xxx'
      
    a=A() # 无输出
    print(a) # 输出xxx 。__str__是print打印出来的,因为print(a)返回值是None
    a # 输出 <A object at 0x......>
    x=print(a) #输出xxx
    print(x) #输出None,因为print返回的是None,无论输出什么,最后返回的始终是None
    #控制台shell和python代码的区别
    #print 输出的是 你给他的东西的 __str__
    #shell 输出的是 你给他的东西的 __reor__

      2、数据结构中的数据输出方式

    #对于 集合、列表、字典、元组,用print输出的话会以__repr__形式打印出来
    
    a=['1','2']
    print(a) #输出 ['1','2']

      3、__name__的问题

    if __name__=='__main__': #什么意思
    
    #后面的'__main__'是个字符串
    #前面的__name__是什么呢?用print(repr(__name__))  就是'__main__'
    
    #import的时候会把那个文件执行一遍
    #如果是导入一个文件,文件内的print(__name__)输出的是这个文件的文件名

      4、异常处理

    def div(a,b):
        try: #尝试运行这段代码
            return a/b
        except Exception: #如果报错,返回False
            return False

      5、函数(闭包)

    class A:
        def __del__(self):
            print('被销毁了')
    
    def fun(): #当函数结束的时候,里面的对象被销毁
        a=A() #a是在函数调用的时候实例化的
    
    fun() #输出 被销毁了
    
    def outer():
        a=A()
        def inner(): #inner也是在outer里面定义的,在outer结束的时候,inner也被销毁了
            print(a)
       
    outer() #  输出 被销毁了
    
    ef outer():
        a=A()
        def inner(): 
               print(a)
        return inner
    
    outer() #输出 被销毁了,原因是return了 但是没有变量接受
    x=outer() #就不会运行__del__了
    
    #所谓闭包,就是内嵌函数用到了外部的变量,函数不销毁,外部的变量就不会销毁,当x指向了inner,外部的变量就不会被销毁
    #当return运行完时,外面的outer函数结束了,但是这个是x指向了inner,而inner内部还有变量a,索引a不会被销毁
    
    
    #闭包作用:1、构造局部的全局变量;2、在没有类的情况下,封装变量

      

  • 相关阅读:
    微信接口开发之高级篇系列【微信权限封装类WechatAuth】
    微信接口开发之高级篇系列【用户分组接口和生成带参数的二维码】
    微信接口开发之高级篇系列【网页授权获取用户基本信息】
    微信接口开发之高级篇系列【微信JS-SDK】
    微信接口开发之高级篇系列【网页授权详细说明【提供测试账号使用】】
    微信接口开发之高级篇系列【网页授权接口】
    历史SQL语句之一
    盘点2019 | 金融科技发展大事件~
    FinTech终于被正名!央行印发金融科技发展规划
    安装配置开源的laravel项目到本地环境
  • 原文地址:https://www.cnblogs.com/xuchengcheng1215/p/8435265.html
Copyright © 2020-2023  润新知