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

一、初始化、析构

  1、初始化

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

  2、析构

    对象被销毁

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

    析构__del__

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

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

二、字符串表示

  1. class Account:
  2.  
  3. def __init__(self,name,number,balance):
  4. self.name=name
  5. self.number=number
  6. self.balance=balance
  7.  
  8. def __del__(self):
  9. print(self.name,'被销毁了')
  10.  
  11. def __str__(self):#向使用者提供尽可能简介且有用的信息
  12. return '{name}:{balance}'.format(name=self.name,balance=self.balance)
  13.  
  14. def __repr__(self):#向开发者提供接近创建时的信息
  15. return '{name}:{balance}'.format(name=self.name,balance=self.balance)
  16.  
  17. a=Account('Tuple','',8888)
  18.  
  19. print(str(a)) #输出 Tuple:8888 简介,有用;只要是在代码里面通过print用的
  20. print(repr(a))#输出 Account('Tuple','123456',8888) 接近创建;只要是在shell里面直接用的
  21.  
  22. print(a) #Tuple:8888 ,如果没有上述函数,输出的只会是内存地址
  23.  
  24. #print函数会输出__str__的返回值。如果没有定义__str__,会输出__repr__的返回值。在shell模式下展示__repr__的返回值,不会去找__str__
  25.  
  26. #总结
    #str会自动触发__str__;repr会自动触发repr;print--->__str__;交互模式 __repr__;如果没有定义__str__,但是使用了str或repr也会触发__repr__
  1. #如何抉择
  2. str #尽可能的提供简洁且有用的信息,让用户尽可能吸收到必要的信息
  3. repr #尽可能向开发者提供创建该对象时的必要信息,让开发者可以直接通过复制粘贴来重建对象。

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

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

四、特殊方法

  1. 特殊方法 简单描述
  2. __name__ 类、函数、方法或生成器的名字
  3. __class__ 一个类实例所属的类
  4. __doc__ 文档字符串
  5. __dict__ 储存了对象属性的字典
  1. def dance():
  2. pass
  3.  
  4. print(dance) #没有调用的函数对象
  5. print(dance.__name__) #函数名叫dance,通过这个看一个函数,类的名字
  6. #Web开发 写路由的时候会用到__name__,网址和函数一一对应
  7.  
  8. class A:
  9. pass
  10.  
  11. b=A()
  12. print(b.__class__) #通过实例来得到类,而不是类名。类名是一个字符串,类是这个对象本身,也可以通过b.__class__()再来一个实例
  13.  
  14. def dib(n):
  15. '''
  16. 这个是斐波那契数列的计算函数
  17. :param n :第n项
  18. :return :第n项的值
  19. '''
  20. if n==1:
  21. return 1# 第一项是1
  22. if n==2:
  23. return 1#第二项是1
  24. return fib()n-1+fib(n-2) #第n项是第n-1项+n-2项
  25.  
  26. print(fib.__doc__) #输出:
  27. 这个是斐波那契数列的计算函数
  28. param n :第n
  29. return :第n项的值
  30.  
  31. class A:
  32. def xxx(self):
  33. pass
  34.  
  35. a=A()
  36. a.name='Tuple'
  37.  
  38. print(a.__dict__)#{'name':'Tuple'}把变量空间a封装的变量以字典形式显示出来
  39. print(A.__dict__)#输出整个类的封装内容

五、解答课

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

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

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

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

  3、__name__的问题

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

  4、异常处理

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

  5、函数(闭包)

  1. class A:
  2. def __del__(self):
  3. print('被销毁了')
  4.  
  5. def fun(): #当函数结束的时候,里面的对象被销毁
  6. a=A() #a是在函数调用的时候实例化的
  7.  
  8. fun() #输出 被销毁了
  9.  
  10. def outer():
  11. a=A()
  12. def inner(): #inner也是在outer里面定义的,在outer结束的时候,inner也被销毁了
  13. print(a)
  14.  
  15. outer() # 输出 被销毁了
  16.  
  17. ef outer():
  18. a=A()
  19. def inner():
  20. print(a)
  21. return inner
  22.  
  23. outer() #输出 被销毁了,原因是return了 但是没有变量接受
  24. x=outer() #就不会运行__del__了
  25.  
  26. #所谓闭包,就是内嵌函数用到了外部的变量,函数不销毁,外部的变量就不会销毁,当x指向了inner,外部的变量就不会被销毁
  27. #当return运行完时,外面的outer函数结束了,但是这个是x指向了inner,而inner内部还有变量a,索引a不会被销毁
  28.  
  29. #闭包作用:1、构造局部的全局变量;2、在没有类的情况下,封装变量

  

python进阶02 特殊方法与特殊属性的更多相关文章

  1. python进阶之内置方法

    python进阶之内置方法 字符串类型的内置方法 常用操作与方法: 按索引取值 str[index] 切片 ste[start:stop:step] 长度 len(str) 成员运算in和not in ...

  2. python进阶02

    1.import导入模块 import sys sys.path:显示的是:从显示目录中查找要导入的模块文件. 程序执行时导入模块路径:sys.path.append('/home/itcast/xx ...

  3. Python基础之魔术方法(控制属性的访问和设置)

    # 魔术方法--常规方法# 1. __int__ 构造函数# 2. __new__ 在类实例之前就创建了# 3. __iter__ 迭代器# 4. __del__ 析构方法,用来清除释放的对象内存# ...

  4. Python 进阶_OOP 面向对象编程_实例属性和方法

    目录 目录 构造器和解构器 构造器 __init__ 真构造器 __new__ 解构器 __del__ 实例方法 Python 中的 抽象方法 实例属性 查看实例属性 实例属性和类属性的区别 访问不可 ...

  5. Python 进阶_OOP 面向对象编程_类属性和方法

    目录 目录 类属性 调用类属性 查看类属性 特殊的类属性 类方法 真构造器 __new__ 类属性 在理解类属性之前要先搞清楚 实例属性 和 函数属性 之间的区别: 1. 实例属性:指的是实例化类对象 ...

  6. Python进阶10---魔术方法*

    特殊属性 查看属性 #animal.py class Animal: x = 123 def __init__(self,name): self._name = name self.__age = 1 ...

  7. python进阶之py文件内置属性

    前言 对于任何一个python文件来说,当python解释器运行一个py文件,会自动将一些内容加载到内置的属性中:一个模块我们可以看做是一个比类更大的对象. 查看模块的内置属性 我们先创建一个典型的p ...

  8. Python进阶02 文本文件的输入输出

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! Python具有基本的文本文件读写功能.Python的标准库提供有更丰富的读写功能 ...

  9. Python 进阶02 文本文件的输入输出

    Python 具有基本的文本文件读写功能,Python的标准库提供有更丰富的读写功能. 文本文件的读写主要通过open()所构建的文件对象来实现 创建文件对象 我们打开一个文件,并适用一个对象来表示该 ...

随机推荐

  1. Ubuntu 更新/安装nodejs

    nvm nvm是一个开源的Node版本管理器,通过简单的bash脚本来管理.切换多个Node.js版本.和nvm提供类似功能的还有tj写的n,它们的功能大同小异,整体来说nvm要稍强大一下.值得注意的 ...

  2. python列表切片

    Python中符合序列的有序序列都支持切片(slice),例如列表,字符串,元组. 格式:[start:end:step] start:起始索引,从0开始,-1表示结束 end:结束索引 step:步 ...

  3. CSS+HTML+JQuery简单菜单

    1. [代码]style <style type="text/css">    body,ul,li,a{        margin:0;        paddin ...

  4. tensorflow knn mnist

    # MNIST Digit Prediction with k-Nearest Neighbors #----------------------------------------------- # ...

  5. highChart数据动态更新

    highChart官网上通过ajax加载数据的例子 上面是第一次生成图表的时候使用 我想动态更新,在已经生成的图表上动态更新 chartBS.series[0].setData(sugarListDa ...

  6. 0x01

    随便记录点想法什么的, 这个博客的编辑界面挺简陋的...

  7. 001-Bootstrap栅格系统

    1 安装和基本使用 外文官网 中文官网 可以正常下载使用 有三个文件夹, 分别是css, fonts, js bootstrap/ ├── css/ │ ├── bootstrap.css │ ├── ...

  8. THUPC2019划水记

    虽然早就打不动了,虽然一个队友提前说好跑路了,还是两个人来玩了玩.最大的失误是没有开场打模拟题,然后就没骗到钱,还是要向某一心骗钱不顾排名的队伍学习.这次的模拟题超简单,很愉快地就打完了,也没调多久, ...

  9. 【Lintcode】103.Linked List Cycle II

    题目: Given a linked list, return the node where the cycle begins. If there is no cycle, return null. ...

  10. 关于redis,学会这8点就够了

    1,redis是什么 redis是一种支持Key-Value等多种数据结构的存储系统.可用于缓存,事件发布或订阅,高速队列等场景.该数据库使用ANSI C语言编写,支持网络,提供字符串,哈希,列表,队 ...