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','',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','',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=['','']
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、在没有类的情况下,封装变量

  

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. curl的安装与使用

    linux 下的curl扩展安装,记录一下(发现网上好多抄袭的也不检测一下能不能用) 1.下载curl安装包: https://curl.haxx.se/download.html 2.解压: 如 t ...

  2. codeforces 587B B. Duff in Beach(dp)

    题目链接: B. Duff in Beach time limit per test 2 seconds memory limit per test 256 megabytes input stand ...

  3. 「USACO08DEC」「LuoguP2922」秘密消息Secret Message(AC自动机

    题目描述 Bessie is leading the cows in an attempt to escape! To do this, the cows are sending secret bin ...

  4. poj2584T-Shirt——网络最大流

    题目:http://poj.org/problem?id=2584 以人和衣服作为点,建立超级源点和超级汇点,人连边权为1的边,衣服对源点连边权为件数的边(别弄乱顺序): 试图写构造函数,但CE了,最 ...

  5. lwip 移植

    一.源码目录结构 api . core.netif. include core下又有IPV4 . IPV6 . SNMP 和.c文件 include下又有IPV4.IPV6.LWIP.netif ne ...

  6. 关于UML图的生成

    想把一个java工程生成UML图非常简单,之前我的eclipse是4.2.0的,没有对应的GEF,所以我索性就直接把工程粘到了My Eclipse中,因为My Eclipse里面有UML自动生成的功能 ...

  7. SoapUI测试登录

    实际登录过程为: 1. 打开/login页面 2. 登录 3. 自动调整至/dashboard页面 SoapUI的设计上,每一次请求后,都会清理掉cookie,于是设计的测试登录过程如下: 1. po ...

  8. 【236】◀▶IEW-Unit01

    Unit 1  Fast Food I.动名词的用法 Doing(V-ing) 核心思想:词性是名词,作用是动词 1. 名词 3)主语(句首) 保护环境是我们每个人的责任. Protecting th ...

  9. 抽象方法(abstract method) 和 虚方法 (virtual method), 重载(overload) 和 重写(override)的区别于联系

    1. 抽象方法 (abstract method) 在抽象类中,可以存在没有实现的方法,只是该方法必须声明为abstract抽象方法. 在继承此抽象类的类中,通过给方法加上override关键字来实现 ...

  10. NSMutableAttributedString及NSMutableParagraphStyle的使用

    一.在iOS开发中,常常会有一段文字显示不同的颜色和字体,或者给某几个文字加删除线或下划线的需求.之前在网上找了一些资料,有的是重绘UILabel的textLayer,有的是用html5实现的,都比较 ...