反射:通过字符串来访问到所对应的值(反射到真实的属性上)。

eg:

 class Foo:
x=1
def __init__(self,name):
self.name=name def f1(self):
print('from f1') # print(Foo.x) #Foo.__dict__['x'] f=Foo('egon')
# print(f.__dict__)
#
# #1:
# print(f.name) #2:
# print(f.__dict__['name']) #hasattr
#反射到字典所对应的值
# print(hasattr(f,'name')) #f.name
# print(hasattr(f,'f1')) #f.f1
# print(hasattr(f,'x')) #f.x #setattr
#设置某个属性
# setattr(f,'age',18)#f.age=18 #getattr
#得到某个属性的值
# print(getattr(f,'name'))#f.name
# print(getattr(f,'abc',None))#f.abc
# print(getattr(f,'name',None))#f.abc # func=getattr(f,'f1')#f.f1
# print(func)
# func()
# #delattr
#删除某个属性的值
# delattr(f,'name')# del f.name
# print(f.__dict__)

定义某个功能,输入某条命令,打印下面的功能:

class Ftpserver:
def __init__(self,host,port):
self.host=host
self.port=port def run(self):
while True:
cmd=input('>>: ').strip()
if not cmd:continue
if hasattr(self,cmd):
func=getattr(self,cmd)
func()
def get(self):
print('get func') def put(self):
print('put func')

item系列:

当触发某些属性的时候,执行某些操作。

 1 class Foo:
2 def __getitem__(self, item):
3 print('=====>get')
4 return self.__dict__[item] #执行你想要的操作
5
6 def __setitem__(self, key, value):
7 self.__dict__[key]=value
8 # setattr(self,key,value) #执行你想要的操作
9
10 def __delitem__(self, key):
11 self.__dict__.pop(key) 执行你想要的操作
12
13
14 f=Foo()
15 # f.x=1
16 # print(f.x)
17 # print(f.__dict__)
18
19 f['x']=123123123123
20
21 # del f['x']
22
23 print(f['x'])

__str__:打印对象信息

在对象被打印的时候触发执行,只能返回字符串类型。

class People:
def __init__(self,name,age,sex):
self.name=name
self.age=age
self.sex=sex def __str__(self): #在对象被打印时触发执行
return '<name:%s age:%s sex:%s>' %(self.name,self.age,self.sex) p1=People('egon',18,'male')
p2=People('alex',38,'male') print(p1)
print(p2)

__del__:在对象资源被释放的时候时触发。

eg:

 class Foo:
def __init__(self,x):
self.x=x def __del__(self): #在对象资源被释放时触发
print('-----del------')
f=Foo(100000)
print('=======================>')

这种相当于在函数执行完了,

触发__del__这个方法

以后打印一个('-----del------')

如果在程序的执行过程中加入  del  (删除某个值得操作)

也会触发程序的执行

class Foo:
def __init__(self,x):
self.x=x def __del__(self): #在对象资源被释放时触发
print('-----del------')
print(self) f=Foo(100000)
del f
print('=======================>')

程序异常的处理:

异常就是程序中运行是发生错误,错误的类型主要有这么几种:

1,语法错误(必须在程序运行之前解决)

2,逻辑错误

3,数据类型错误

4,索引错误

5,字典的key错误

如果错误发生的条件是不可预知的,则需要用到try....expect:在错误发生之后进行处理

基本语法为:

try:

  被检测的代码块

expect 异常类型:

  try中一旦检测到异常,就执行这个位置的逻辑

try:
aaaa
print('==-==>1')
# l=[]
# l[3]
# print('==-==>2')
# d={}
# d['x']
# print('==-==>3')
except NameError as e:
print(e)
except IndexError as e:
print(e)
except KeyError as e:
print(e)
except Exception as e:
print(e)
else:
print('在没有错误的时候执行')
finally:
print('无论有无错误,都会执行')

#raise   ......    在执行到某段的时候,自己抛出异常

#什么时候用try.....expect

是错误一定会发生,但是不确定在什么时候预知的条件时,用这个条件

Day8 面向对象反射 item方法 打印对象信息__str__ 构析方法__del__ 程序的异常处理的更多相关文章

  1. 跟着百度学PHP[4]OOP面对对象编程-6-构造方法(__construct)和构析方法(__destruct)

    函数就是成员方法(方法有三:构造方法.成员方法.析构方法) 下面是两种方法. 构造方法和构析方法 00x1 构造方法 构造方法会在创建对象之后自动调用.其名称为__construct <?php ...

  2. python面向对象( item系列,__enter__ 和__exit__,__call__方法,元类)

    python面向对象进阶(下)   item系列 __slots__方法 __next__ 和 __iter__实现迭代器  析构函数 上下文管理协议 元类一.item系列 把对象操作属性模拟成字典的 ...

  3. Java反射获取类和对象信息全解析

    反射可以解决在编译时无法预知对象和类是属于那个类的,要根据程序运行时的信息才能知道该对象和类的信息的问题. 在两个人协作开发时,你只要知道对方的类名就可以进行初步的开发了. 获取类对象 Class.f ...

  4. print(dir(...)) 打印对象或者类中的方法和函数

  5. php 抽象类、接口和构析方法

    <?php /*class Ren { public static $color; static function Show() { Car::$name; self::$color; } } ...

  6. python全栈开发从入门到放弃之面向对象反射

    1.classmethod.staticmethod方法 classmethod类方法默认参数cls,可以直接用类名调用,可以与类属性交互 #student文件内容 宝宝,男 博博,女 海娇,男 海燕 ...

  7. Java学习day9面向对象编程2-方法的可变个数的参数和方法的参数传递

    一.方法的可变个数的参数. 问题:我们能够打印的信息都是来源于方法的参数,也就是形参的传递.那如何要给方法传递不同的参数? .1.采用数组形参来定义方法 public static void test ...

  8. java基础之对象当做参数传进方法的堆栈内存解析

    值类型当做参数传进方法: 引用类型对象当做参数传进方法: String字符串当做参数传进方法:

  9. SpringBoot 使用 RestTemplate 调用exchange方法 显示错误信息

    SpringBoot使用RestTempate SpringBoot使用RestTemplate摘要认证 SpringBoot使用RestTemplate基础认证 SpringBoot使用RestTe ...

随机推荐

  1. 手把手教你轻松实现listview上拉加载

    上篇讲了如何简单快速的的实现listview下拉刷新,那么本篇将讲解如何简单快速的实现上拉加载更多.其实,如果你已经理解了下拉刷新的实现过程,那么实现上拉加载更多将变得轻松起来,原理完全一致,甚至实现 ...

  2. tomcat服务器虚拟目录的映射方式

    lWEB应用程序指供浏览器问的程序,通常也简称为web应用 l l一个web应用由多个静态web资源和动态web资源组成,如: •html.css.js文件 •jsp文件.servlet程序.支持ja ...

  3. 轻松学习Asp.net中的控件

    C/S 结构,即大家熟知的客户机和服务器结构.它是软件系统体系结构,通过它可以充分利用两端硬件环境的优势,将任务合理分配到Client端和Server端来实现,降低了系统的通讯开销.目前大多数应用软件 ...

  4. 尚学堂马士兵struts2 课堂笔记(一)

    06_尚学堂马士兵_Struts2_Struts2_HelloWorld_5 <constant name="struts.devMode" value="true ...

  5. leetcode之 Palindrome Partitioning I&II

    1 Palindrome Partitioning 问题来源:Palindrome Partitioning 该问题简单来说就是给定一个字符串,将字符串分成多个部分,满足每一部分都是回文串,请输出所有 ...

  6. Java之谜 —— 来自Neal Gafter的演讲

    翻译人员: 铁锚 翻译日期: 2013年11月20日 原文链接: A Puzzle from "A Brief History of the (Java) World and a Peek ...

  7. Dynamics CRM2013 Server2012下部署ADFS和IFD遇到的问题No Organization were retrived

    最近一直在折腾Windows Server2012下的IFD部署,其中各种纠结啊错误百出,要想顺利的一步到位只能说看你的RP怎么样了,具体的操作过程推荐看下勇哥的博客:http://luoyong02 ...

  8. 开源视频会议系统:OpenMeetings 安装方法

    OpenMeetings是一个多语言可定制的视频会议和协作系统.说到OpenMeetings就应该提一下red5因为OpenMeetings 的视频服务是加载red5上面的.Red5是一款基于JAVA ...

  9. 《java入门第一季》之Arrays类前传(排序问题)

    一:冒泡排序 /* * 数组排序之冒泡排序: * 相邻元素两两比较,大的往后放,第一次完毕,最大值出现在了最大索引处 * * 引申: * 利用冒泡排序法,可以获取一个数组的最大值(先冒泡排序,取最后一 ...

  10. 2015年北京的第一场雪-关于android学习的思考(84)

    今天是2015年11月6日,今天北京下了大雪,我听着民谣,发现丢火车的摇滚也还不错,我身体的一部分毛发也发生了变异,由黑色变成红色,一切来的太突然了......不知不觉学习android开发2年多了, ...