python面向对象中的反射:通过字符串的形式操作对象相关的属性。python中的一切事物都是对象(都可以使用反射)

 #!_*_ coding:utf-8 _*_

 class People:
def __init__(self, name, age):
self.name = name
self.age = age def talk(self):
print("%s is talking" % self.name) p = People("Jack",20) print(hasattr(p,"name")) # 判断对象p中有没有name属性 p.__dict__["name"]
print(p.__dict__["name"]) print(getattr(p, "age", None)) # 获取对象中age的值
print(getattr(p, "age11", None)) # 不存在会返回None setattr(p,"sex", "男") #可以在修改和新增
print(p.sex) delattr(p, 'age')
print(p.__dict__) # {'name': 'Jack', 'sex': '男'} age已经被删除了

反射的应用:

# #!_*_ coding:utf-8 _*_
#
# class People:
# def __init__(self, name, age):
# self.name = name
# self.age = age
#
# def talk(self):
# print("%s is talking" % self.name)
#
#
# p = People("Jack",20)
#
# print(hasattr(p,"name")) # 判断对象p中有没有name属性 p.__dict__["name"]
# print(p.__dict__["name"])
#
# print(getattr(p, "age", None)) # 获取对象中age的值
# print(getattr(p, "age11", None)) # 不存在会返回None
#
# setattr(p,"sex", "男") #可以在修改和新增
# print(p.sex)
#
# delattr(p, 'age')
# print(p.__dict__) # {'name': 'Jack', 'sex': '男'} age已经被删除了
#
#
# 反射的应用.模拟用户输入一些命令,让程序去调用这些命令.
# class Service:
# def run(self):
# while True:
# # inp = input(">>>>:").strip() #正常输入一个命令,判断在类中有没有这样一个属性方法.如果有就去执行.
# inp = input(">>>>:").strip()
# if hasattr(self,inp):
# func = getattr(self,inp)
# func()
# elif inp == "b":
# break
# else:
# print("input error")
#
#
#
# def get(self):
# print("get.....")
#
#
# def put(self):
# print("put.....")
class Service:
def run(self):
while True:
# inp = input(">>>>:").strip() #正常输入一个命令,判断在类中有没有这样一个属性方法.如果有就去执行.
inp = input(">>>>:").strip()
cmds = inp.split() # 用户传入get b.txt 这样的命令,进行分割
print(cmds)
if hasattr(self,cmds[0]):
func = getattr(self,cmds[0])
func(cmds)
elif inp == "b":
break
else:
print("input error") def get(self,cmds):
print("get.....", cmds) def put(self,cmds):
print("put.....",cmds) obj = Service() obj.run()

__setitem__,__getitem,__delitem__

 class Foo:

     def __init__(self, name, age):
self.name = name
self.age = age def __getitem__(self, item):
return self.__dict__.get(item) def __setitem__(self, key, value):
self.__dict__[key] = value # 新增或者修改对象的字典. def __delitem__(self, key):
# self.__dict__.pop(key) # 删除相应的键值对
del self.__dict__[key] # 两种删除方法. obj = Foo("Jack",19)
# 查看.如果我们使用["str"]的方式来取值时,总是会调用__getitem__方法.
print(obj["age"]) #
print(obj["name"]) # Jack
# 新增或修改.调用的是___setitem__的方法.
obj["sex"] = "男"
obj["age"] = 20
print(obj.__dict__) # {'name': 'Jack', 'age': 20, 'sex': '男'}
print(obj["sex"]) # 男
# 删除.调用__delitem__方法
del obj["age"]
print(obj.__dict__) # 删除后,__dict__中已经没有age这个键值对了.{'name': 'Jack', 'sex': '男'}

__str__方法

作用:使用print方法打印对象时,可以通过__str__方法,把内容显示出来.

 # __str__方法

 class People:

     def __init__(self, name, age):
self.name = name
self.age = age def __str__(self): #__str__方法,会在print(obj)对象的时候,会被调用.返回的必须是一个字符串形式的内容.否则报错.
data = {
"name":self.name,
"age":self.age } return str(data) # 把字典转成字符串格式.否则报错. p1 = People("Jack", 19)
print(p1) # 调用的是__str__方法.等价于print(p1.__str__())

__del__方法

作用:在python程序运行结束之前,把调用的操作系统的资源回收掉.(清空)

 class Open:

     def __init__(self,filename):
self.filename = filename
print("Open file.....") def __del__(self):
print("系统回收资源中.....") f = Open("1.txt") print("pro is end") # 程序执行到这里的时候,接下来会执行__del__方法,回收掉py调用的操作系统的资源.

__new__方法:

class People(object):

    def __init__(self):
print("__init__") def __new__(cls, *args, **kwargs): #__new__是创建实例的方法,而__init__则是创建后,调用的方法.
print("__new__")
return object.__new__(cls, *args, **kwargs) People()
#__new__
#__init__

Day 5-6 反射和内置方法之item系列的更多相关文章

  1. 内置方法(item系列)

    class Foo: def __init__(self,name): self.name = name def __getitem__(self, item): # 获取时触发 print('get ...

  2. python 面向对象之反射及内置方法

    面向对象之反射及内置方法 一.静态方法(staticmethod)和类方法(classmethod) 类方法:有个默认参数cls,并且可以直接用类名去调用,可以与类属性交互(也就是可以使用类属性) 静 ...

  3. Python反射和内置方法(双下方法)

    Python反射和内置方法(双下方法) 一.反射 什么是反射 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力(自省).这一概念的提出很快引发 ...

  4. 面向对象(五)——isinstance与issubclass、反射、内置方法

    isinstance与issubclass.反射.内置方法 一.isinstance与issubclass方法 1.isinstance是用来判断对象是否是某个类 isinstance(obj,cla ...

  5. 反射与内置方法str del

    1.反射 用字符串来操作类或者对象的属性 class People:# country= 'china'# def __init__(self,name):# self.name= name## de ...

  6. Learning-Python【26】:反射及内置方法

    反射的概念 可以用字符串的方式去访问对象的属性,调用对象的方法(但是不能去访问方法),Python 中一切皆对象,都可以使用反射. 反射有四种方法: hasattr:hasattr(object, n ...

  7. python面向对象 : 反射和内置方法

    一. 反射 1. isinstance()和issubclass() isinstance( 对象名, 类名) : 判断对象所属关系,包括父类  (注:type(对象名) is 类名 : 判断对象所属 ...

  8. Python之路(第二十五篇) 面向对象初级:反射、内置方法

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

  9. 27 isinstance与issubclass、反射、内置方法

    isinstance与issubclass issubclass:判断子类是否属于父类,是则返回True,否则返回False isinstance:判断对象是否属于类,是则返回True,否则返回Fal ...

随机推荐

  1. centos7下kubernetes(8.kubernetes Failover)

    上一节我们运行的3个容器 其中有两个是运行在node2上一个运行在node1上,现在我们关闭node1,观察node1上的容器会发生什么变化 目前node1已经处于notready状态 现在我们查看一 ...

  2. centos7 mongodb安装

    参考文档 http://www.runoob.com/mongodb/mongodb-connections.html https://www.cnblogs.com/layezi/p/7290082 ...

  3. 【转】iOS中修改AVPlayer的请求头信息

    在开发中, 我们经常需要在网络请求时修改HTTP/HTTPS的请求头信息 1.普通AFN请求 #import "LMHTTPSessionManager.h" #import &l ...

  4. Python:Day09

    Ubantu忘记密码: 1.开机长按shift,进入界面后按e: 2.将红框中内改成如下并按F10重启: 3.输入passwd,然后用户名,然后重新输入密码: locale命令查看系统中是否有中文 a ...

  5. 007_Python中的__init__,__call__,__new__

    __init__函数 当一个类实例被创建时, __init__() 方法会自动执行,在类实例创建完毕后执行,类似构建函数.__init__() 可以被当成构建函数,不过不象其它语言中的构建函数,它并不 ...

  6. pip 提速方法

    Python 包管理软件 pip 在默认情况下,下载安装 Python 包太慢,容易失败.以下给出解决方案. pip install 的选项说明如下: Package Index Options: - ...

  7. while和do-while语句的异同之处

    while型语句: “先判断,后执行”: while 执行流程: 当程序执行到 while 循环时 , 会首先判断小括号里的值 ,如果值 为假 :结束while语句 , 程序继续向下走  为真 :会把 ...

  8. 从零开始搭建django前后端分离项目 系列一(技术选型)

    前言 最近公司要求基于公司的hadoop平台做一个关于电信移动网络的数据分析平台,整个项目需求大体分为四大功能模块:数据挖掘分析.报表数据查询.GIS地理化展示.任务监控管理.由于页面功能较复杂,所以 ...

  9. bootstrap 失效的原因

    首先必须对着官方文档的模板来写: https://getbootstrap.com/docs/4.3/getting-started/introduction/ 然后: 这里必须加上 rel=&quo ...

  10. JSOUP如何优秀的下载JPEG等二进制图像

    引言 JSOUP默认是不支持解析JPEG等二进制图像的,解决方法也很简单,只需要加上Jsoup.ignoreContentType(true)这一行代码就可以.关于这一点的原因,来看看官方API说明. ...