7.10 反射

下述四个函数是专门用来操作类与对象属性的。通过字符串来操作类与对象的属性,这种操作称为反射

class People:
country="China"
def __init__(self,name):
self.name=name
def tell(self):
print('%s is aaa' %self.name)

obj=People('egon')

hasattr:

print(hasattr(People,'country'))         #True
print('country' in People.__dict__) #True
print(hasattr(obj,'name')) #True
print(hasattr(obj,'country')) #True
print(hasattr(obj,'tell')) #True

getattr:

x=getattr(People,'country',None)
print(x) #China

f=getattr(obj,'tell',None)
print(f) #<bound method People.tell of <__main__.People object at 0x000001E6AA9EACC0>>
print(obj.tell) #<bound method People.tell of <__main__.People object at 0x000001E6AA9EACC0>>

setattr:

People.x=111
setattr(People,'x',111)
print(People.x) #

obj.age=18
setattr(obj,"age",18)
print(obj.__dict__) #{'name': 'egon', 'age': 18}

delattr:

del People.country
delattr(People,"country")
print(People.__dict__)

del obj.name
delattr(obj,"name")
print(obj.__dict__) # {'age': 18}

反射的应用:

class Foo:
def run(self):
while True:
cmd=input('cmd>>: ').strip() #用户输入的是字符串
if hasattr(self,cmd):
func=getattr(self,cmd) #拿到函数地址
func() def download(self):
print('download....')

def upload(self):
print('upload...')

obj=Foo()
obj.run()

7.11__str__方法

__str__( )用于在对象print( )时自动触发

class People:
def __init__(self,name,age,sex):
self.name=name
self.age=age
self.sex=sex

def __str__(self):
return '<名字:%s 年龄:%s 性别:%s>' %(self.name,self.age,self.sex)

obj=People('egon',18,'male')
print(obj) # <名字:egon 年龄:18 性别:male> # print(obj.__str__())

# l=list([1,2,3])
# print(l)

7.12 __del__方法

__del__( )用于在对象被删除前,自动执行

class MyOpen:
def __init__(self,filepath,mode="r",encoding="utf-8"):
self.filepath=filepath
self.mode=mode
self.encoding=encoding
self.fobj=open(filepath,mode=mode,encoding=encoding) #申请系统资源

def __del__(self): # 在回收程序空间(对象被删除)前自动触发__del__( ),删除文件空间(系统空间)
self.fobj.close()
f=MyOpen('aaa.py',mode='r',encoding='utf-8')
res=f.fobj.read()
print(res)

python 之 面向对象(反射、__str__、__del__)的更多相关文章

  1. Day08:继承与派生,多态,封装,绑定与非绑定方法,面向对象高级(反射,__str__,__del__)

    上节课复习:1.编程思想    面向过程        核心是过程二字,过程指的是解决问题的步骤,即先干什么再干什么后干什么        基于该思想编写程序就好比在设计一条流水线,是一种机械式的思维 ...

  2. Python之面向对象反射

    Python之面向对象反射 isinstance(obj,cls)检查是否obj是否是类 cls 的对象 1 class Foo(object): 2 pass 3 4 obj = Foo() 5 6 ...

  3. Python之面向对象-反射

    一.什么是反射 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问,检测和修改它本省状态或行为的一种能力(自省).这一概念的提出很快引发了计算机科学领域关于应用反射性的研究.它首先被 ...

  4. python基础-9__import__ 反射和面向对象基础 self 封装 继承(多继承顺序) 多态

    一 反射 python中的反射功能是由以下四个内置函数提供:hasattr.getattr.setattr.delattr,改四个函数分别用于对对象内部执行:检查是否含有某成员.获取成员.设置成员.删 ...

  5. 【转】Python之面向对象与类

    [转]Python之面向对象与类 本节内容 面向对象的概念 类的封装 类的继承 类的多态 静态方法.类方法 和 属性方法 类的特殊成员方法 继承层级关系中子类的实例对象对属性的查找顺序问题 一.面向对 ...

  6. Python OOP面向对象

    一.什么是面向对象的程序设计 1.面向过程 程序设计:核心是过程二字,过程指的是解决问题的步骤,即先干什么再干什么......面向过程的设计就好比精心设计好一条流水线,是一种机械式的思维方式. 优点是 ...

  7. Python 【面向对象】

    前言 Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对象是很容易的.本章节我们将详细介绍Python的面向对象编程. 如果你以前没有接触过面向对象的编程语言 ...

  8. Python之路- 反射&定制自己的数据类型

    一.isinstance和issubclass isinstance(obj,cls)检查是否obj是否是类 cls 的对象 issubclass(sub, super)检查sub类是否是 super ...

  9. Python -面向对象(一 基本概念)

    一 Python简单介绍 Python是一个可移植的面向对象的脚本语言. Python尽管是一个脚本语言,但也是一个全然面向对象的语言.由于它设计之初把易用性做为很重要的一个考量标准,所以用起来很简洁 ...

  10. python初始面向对象

    阅读目录 楔子 面向过程vs面向对象 初识面向对象 类的相关知识 对象的相关知识 对象之间的交互 类命名空间与对象.实例的命名空间 类的组合用法 初识面向对象小结 面向对象的三大特性 继承 多态 封装 ...

随机推荐

  1. vmvare ESXi使用

    新建主机,选择系统,自定义配置,选择ios镜像,完成,打开电源,开启配置

  2. 将两个各有n个元素的有序表归并成一个有序表,其最多的比较次数

    最多的比较次数是当两个有序表的数据刚好是插空顺序的时候,比如:第一个序列是1,3,5,第二个序列是2,4,6,把第二个序列插入到第一个序列中,先把第二个序列中的第一个元素2和第一个序列依次比较,需要比 ...

  3. 【CF1142B】Lynyrd Skynyrd

    [CF1142B]Lynyrd Skynyrd 题面 洛谷 题解 假设区间\([l,r]\)内有一个循环位移,那么这个循环位移一定有一个最后的点,而这个点在循环位移中再往前移\(n-1\)个位置也一定 ...

  4. 第01组 Alpha冲刺(3/6)

    队名:007 组长博客: https://www.cnblogs.com/Linrrui/p/11873424.html 作业博客: https://edu.cnblogs.com/campus/fz ...

  5. CloudFlare上线了新的Proxy Anything选项, 支持转发TCP连接

    https://www.nicho1as.wang/articles/cf-proxy-anything.html 申请地址:https://goo.gl/forms/Oc2jyyo0kXsrMyw3 ...

  6. MySQL索引原理(三)

    多个单列索引和联合索引的区别详解 背景:为了提高数据库效率,建索引是家常便饭:那么当查询条件为2个及以上时,我们是创建多个单列索引还是创建一个联合索引好呢?他们之间的区别是什么?哪个效率高呢?我在这里 ...

  7. RSA加密公钥系数获取结果多00

    写在前面 本文是在解决加密和解密用的不是同一套密钥对时找到的一篇, 最后问题不在byte数组, 是自己工具类中生成密钥对的问题, 但是本文RSA加密中公钥指数和公钥系数的获取(byte[]部分)讲解比 ...

  8. 使用ssh-keygen生成私钥和公钥

    1.使用ssh-keygen生成私钥和公钥 命令如下: ssh-keygen -t rsassh-keygen -t rsa -C "用户名自取"可以是邮箱 例子: fdipzon ...

  9. python快速搭建http服务

    在Windows 7/10或Ubuntu上可以通过python2.x或python3.x来快速搭建一个简单的HTTP服务器. 如果python为2.x,则可执行:$ python -m SimpleH ...

  10. python工程设置工具(pipenv)

    原始安装 pip工具 --- 包安装工具, 可以从Python包索引hub上安装,也可以使用自定义的hub. 命令: pip install xxx 缺点: 1.命令方式, 一次只能安装一个包, 对于 ...