python面向对象--反射机制
class Black:
feture="ugly" def __init__(self,name,addr):
self.addr=addr
self.name=name def sell_house(self):
print("[%s] 正在卖房子"%self.name) def rent_house(self):
print("[%s]正在租房子,傻逼才租呢?"%self.name) b1=Black("dream","北京海淀")
print(hasattr(Black,"feture"))
#b1.name--->b1__dict__["name"]
# print(hasattr(b1,"name"))#b1.name
# print(hasattr(b1,"sell_house"))
#
#
# print(getattr(b1,"name"))
# print(getattr(b1,"sell_house"))
#
# func=getattr(b1,"rent_house")#没有报错
# func()
#
#
# print(getattr(b1,"rent_house11","没有这个属性")) # b1.sb=True
# setattr(b1,"sb",True)
# setattr(b1,"name","alex")
setattr(b1,"func",lambda x:x+1)
setattr(b1,"func1",lambda self:self.name+"sb")
print(b1.__dict__)
print(b1.func)
print(b1.func(1)) print(b1.func1(b1))
# del b1.sb # print(b1.__dict__) # delattr(b1,"sb") # print(b1.__dict__)
1.getattr(object,name)
说明:如果对象object,是不是有name这个属性,如果有获取他的属性,如果没有则报错
2. hasattr(object, name) 说明:判断对象object是否包含名为name的特性(hasattr是通过调用getattr(ojbect, name)是否抛出异常来实现的) 3. setattr(object, name, value) 这是相对应的getattr()。参数是一个对象,一个字符串和一个任意值。字符串可能会列出一个现有的属性或一个新的属性。这个函数将值赋给属性的。该对象允许它提供。例如,setattr(x,“foobar”,123)相当于x.foobar = 123。 4. delattr(object, name) 与setattr()相关的一组函数。参数是由一个对象(记住python中一切皆是对象)和一个字符串组成的。string参数必须是对象属性名之一。该函数删除该obj的一个由string指定的属性。delattr(x, 'foobar')=del x.foobar
# class Foo:
# x=1
# def __init__(self,y):
# self.y=y
#
# def __getattr__(self, item):
# print("执行__getattr__")
#
# def __delattr__(self, item):
# print("删除操作__delattr__")
#
# def __setattr__(self, key, value):#设定属性
# print("执行__setattr__")
# # self.key=value
# self.__dict__[key]=value # f1=Foo(10)
#
# print(f1.y)
# print(getattr(f1,"y"))# len(str)--->str.__len__()
#
# f1.ss #调用一个对象不存在的属性时触发__getattr__
#
#
# del f1.y#删除的时候触发__delattr__属性
# print(f1.x)
#
# f1.x=2#赋值的时候触发__setattr__
# print(f1.__dict__) # print(dir(Foo)) class Foo:
def __init__(self,name):
self.name=name def __getattr__(self, item):
print("你找的属性[%s]不存在"%item) def __setattr__(self, key, value):
print("执行setattr",key,value) if type(value) is str:
print('开始设置')
# self.key=value#触发__setattr__
self.__dict__[key]=value else:
print("必须是字符串类型") def __delattr__(self, item):
# print("执行delattr",item)
print("不允许删除属性[%s]"%item)
#del self.item
# self.__dict__.pop(item) f1=Foo("alex")
f1.age=18#触发__setattr__
#print(f1.__dict__) # print(f1.name)
# print(f1.age)
# print(f1.gender) print(f1.__dict__)
del f1.name
print(f1.__dict__)
# print(f1.__dict__)
####getattribute的使用
class Foo:
def __init__(self,y):
self.y=y def __getattr__(self, item):
print("你找不到的时候执行我") def __getattribute__(self, item):
print("执行的是getattribute")
#raise AttributeError("抛出异常") f1=Foo(10)
# f1.y
f1.xx # f1.xxx#不存在属性访问触发__getattr__
#触发顺序 __getattribute__(最先执行,通过报错上升到,raise xxerror)--->__getattr__(属性找不到报错时执行)
python面向对象--反射机制的更多相关文章
- python的反射机制
转载自:http://www.cnblogs.com/feixuelove1009/p/5576206.html 对编程语言比较熟悉的朋友,应该知道"反射"这个机制.Python作 ...
- 简单谈谈python的反射机制
转:http://www.jb51.net/article/87479.htm 本文主要介绍python中的反射,以及该机制的简单应用,熟悉JAVA的程序员,一定经常和Class.forName打交道 ...
- 【转】简单谈谈python的反射机制
[转]简单谈谈python的反射机制 对编程语言比较熟悉的朋友,应该知道“反射”这个机制.Python作为一门动态语言,当然不会缺少这一重要功能.然而,在网络上却很少见到有详细或者深刻的剖析论文.下面 ...
- 详解python之反射机制
一.前言 def f1(): print('f1') def f2(): print('f2') def f3(): print('f3') def f4(): print('f4') a = 1 t ...
- python之反射机制与callattr()、issubclass()、isinstance、type()相关
一.反射机制 * 反射可以理解为 通过字符串的形式,动态导入模块: 利用字符串的形式,在对象(模块)中操作(查找/获取/删除/添加)成员,是一种基于字符串的事件驱动! 反射机制的内置函数 # hasa ...
- python -- 面向对象 - 反射
1.isinstance ,type, issubclass isinstance:判断给的对象是否是**类型 type:返回**对象的数据类型 issubclas ...
- python面向对象 : 反射和内置方法
一. 反射 1. isinstance()和issubclass() isinstance( 对象名, 类名) : 判断对象所属关系,包括父类 (注:type(对象名) is 类名 : 判断对象所属 ...
- Python之反射机制
什么是反射? 1.有时我们要访问某个变量或是方法时并不知道到底有没有这个变量或方法,所以就要做些判断.判断是否存在字符串对应的变量及方法.2.我们知道访问变量时是不能加引号的,否则会被当成字符串处理. ...
- python面向对象反射-框架原理-动态导入-元类-自定义类-单例模式-项目的生命周期-05
反射 reflect 反射(reflect)其实是反省,自省的意思 反省:指的是一个对象应该具备可以检测.修改.增加自身属性的能力 反射:通过字符串获取对象或者类的属性,进行操作 设计框架时需要通过反 ...
随机推荐
- 10.1 ‘The server's host key is not cached in the registry’
10.1 ‘The server's host key is not cached in the registry’ This error message occurs when PuTTY conn ...
- Win10.更新
1.资料: win10怎么关闭自动更新?win10关闭自动更新步骤-太平洋IT百科.html(https://product.pconline.com.cn/itbk/software/win10/1 ...
- 006/搭建fabric(二)
准备vmware虚拟机,并安装完ubuntu系统后.继续搭建fabric运行环境... 0.打开终端,切换root身份.目的:后续操作即可不用sudo... 右键->open Terminal- ...
- SQL server 2008r2 file is corrupt
下载的SQLManagement studio有问题,重新下载一遍后再安装就好了.安装顺序没问题. 在卸载SQL Server开始——运行:输入regedit 进入注册表编辑器,进入之后执行下列操作: ...
- oracle--约束(主键、非空、检查)
问题1:学号重复了,数据还可以插入成功 使用主键约束:学号是唯一标识一条数据的,所以必须唯一且不能为空 ---(1).在确定为主键的字段后添加 primary key关键字 ---(2).在创建表的后 ...
- 红黑树的删除操作---以JDK源码为例
删除操作需要处理的情况: 1.删除的是红色节点,则删除节点并不影响红黑树的树高,无需处理. 2.删除的是黑色节点,则删除后,删除节点所在子树的黑高BH将减少1,需要进行调整. 节点标记: 正在处理的节 ...
- Redis 21问,你接得住不?
作者:菜鸟小于 cnblogs.com/Young111/p/11518346.html 1.什么是redis? Redis 是一个基于内存的高性能key-value数据库. 2.Reids的特点 R ...
- 关于java的数组
一定要写成 int[] arr = new int[30] 这样每个元素默认为0; 介样子的 如果写成 int[] arr = {1,2,3,4}; 那么他的长度就是4
- HDU 5945 题解(DP)(单调队列)
题面: Fxx and game Time Limit: 3000/1500 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others) T ...
- Appium+Python之PO模型(Page object Model)
思考:我们进行自动化测试时,如果把代码都写在一个脚本中,代码的可读性会变差,且后期代码维护也麻烦,最好的想法就是测试对象和测试用例可以分离,可以很快定位问题,代码可读性高,也比较容易理解.这里推荐大家 ...