day 22 反射,双下方法
反射:
反射:通过字符串去操作对象(类,空间等等)的属性或方法
反射的四个方法
hasattr ***
getattr ***
setattr ***
delattr ***
# getattr 用法
class A:
role = '太白'
def func(self):
print(666)
conter = input('请输入: ') #str类型 输入role
ret = getattr(A,conter) # 即使conter = 'role'字符串的role,A.role也可以找到
print(ret)
hasattr, getattr, setattr, delattr 用法示例
# 操作对象的角度
class A:
country = 'China'
area = '深圳' def __init__(self,name,age):
self.name = name
self.age = age def func(self):
print(666)
#
obj = A('忠敏',18)
# print(obj.name) # 忠敏
print(hasattr(obj,'name')) # True 判断对象有没有此属性
if hasattr(obj,'name'):
print(getattr(obj,'name')) # 相当于 print(obj.name)
print(getattr(obj,'sex',None)) # 获得obj的sex值,如果没有则返回None
print(obj.country)
print(getattr(obj,'country')) # 可以获得类的静态属性
obj.func()
ret = getattr(obj, 'func') # ret = func的内存地址
print(ret)
ret()
print(obj.sex) # 没有改属性,报错
setattr(obj,'sex','男') # 设置sex = '男'
print(obj.sex)
delattr(obj,'name') # 删除该属性
print(obj.name)
操作类的角度
class A:
country = 'China'
area = '深圳' def __init__(self,name,age):
self.name = name
self.age = age def func(self):
print(666) print(getattr(A,'country')) #
print(getattr(A,'area'))
print(getattr(A,'name)) # name是对象的属性,类找不到
getattr(A,'func')(23) # 可以执行类的方法
print(hasattr(A,'func2')) # False 没有func2
操作另一个py文件
import attr # attr.py
print(getattr(attr,'flag'))
# 1,找到func 并执行
ret = getattr(attr,'func')
print(ret(10))
#2,找到B类并调用 name_list func函数
b = getattr(attr,'B')
print(b.name_list)
本文件操作
import sys
obj = sys.modules[__name__] # obj = 本py文件
print(obj)
# def func():
# print(666)
#
# ret = input('>>>') # 输入func
# # ret() # 无法执行func()
# getattr(obj,ret)() # 可以执行func() def func1():
print('in func1') def func2():
print('in func2') def func3():
print('in func3') l1 = ['func%s' % i for i in range(1,4)] # l1 = ['func1', 'func2', 'func3']
print(l1)
# print(l1)
for i in l1: # i = 'func1' 字符串
getattr(obj,i)()
到底什么对象才可以用反射?
实例化对象 类 其他模块 本模块 只有能通过.的方式获取的,才可以用反射。(函数不能使用反射)
双下方法:(含有两个下划线)
双下方法是给python源码的开发者用
s1 = 'saekfjldkjase'
print(len(s1)) # 相当于 s1.__len__()
print(s1.__len__())
isinstance 判断此对象是不是该类(或者是该类的子类)实例化的对象
class A: pass
class B(A): pass
obj = A()
print(isinstance(obj,A)) # True
print(isinstance(obj,B)) # False
issubclass 判断的是此类是不是后面类的派生类
class D: pass
class A(D): pass
class B(A): pass
print(issubclass(B,A)) #True
print(issubclass(B,D)) #True
特殊双下方法:
# __len__ 方法 class A:
def __init__(self,name,age):
self.name = name
self.age = age
self.sex = '男' def __len__(self):
# print(666)
return len(self.__dict__) # 返回字典的长度
a = A('barry', 18)
len(a) # len(对象) 如果此类中有__len__ 方法会自动执行__len__
print(len(a))
__hash__ __str__
class A:
def __init__(self,name,age):
self.name = name
self.age = age
self.sex = '男' def __len__(self):
# print(666)
return len(self.__dict__) def __hash__(self):
return 1 def __str__(self):
print(555)
return 'fdsaf' # object
a = A('barry', 18)
print(hash(a)) # 定义了__hash__方法,所以自动执行
print(a,type(a)) # 对一个对象打印时,自动触发类中的__str__方法
__call__ 方法: 对象(),会触发 __call__ 方法
class Foo:
def __init__(self):
print(11)
def __call__(self, *args, **kwargs):
print(123)
obj = Foo()
obj() # 对象() 触发 __call__方法
__new__ 方法,实例化对象发生的三件事
1, 类名() 执行object.__new__方法,开辟对象空间并返回
2,自动执行__init__方法,将空间创给self
3,在__init__给对象封装属性
class A:
def __init__(self,name):
self.name = name
print('in A __init__')
def __new__(cls, *args, **kwargs): # 自定义了一个__new__方法
print('in A __new__')
return object.__new__(cls) # 返回一个python内置的__new__方法 a = A('春哥')
print(a.name)
单例模式: 让一个类只能实例化一个对象
class A():
__instance = None
def __init__(self,name,age):
self.name = name
self.age = age def __new__(cls, *args, **kwargs):
if cls.__instance is None:
obj = object.__new__(cls)
cls.__instance = obj
return cls.__instance
item系列将对象视为字典使用时,就会触发item方法
class Foo:
def __init__(self,name):
self.name = name def __getitem__(self, item):
# print(666)
return self.name
# print(self.__dict__[item]) def __setitem__(self, key, value):
# print(key)
# print(value)
self.__dict__[key]=value def __delitem__(self, key):
print('del obj[key]时,我执行')
self.__dict__.pop(key)
def __delattr__(self, item):
print('del obj.key时,我执行')
self.__dict__.pop(item) f1 = Foo('sb')
ret = f1['name']
print(ret)
# f1['age'] = 12
# # print(f1.__dict__)
# print(f1.age)
#
#
# f1['age']=18
# f1['age1']=19
# del f1.age1
# del f1['age']
# f1['name']='alex'
# print(f1.__dict__)
day 22 反射,双下方法的更多相关文章
- 百万年薪python之路 -- 面向对象之 反射,双下方法
面向对象之 反射,双下方法 1. 反射 计算机科学领域主要是指程序可以访问.检测和修改它本身状态或行为的一种能力(自省) python面向对象中的反射:通过字符串的形式操作对象相关的属性.python ...
- Python面向对象之反射,双下方法
一. 反射 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力(自省).这一概念的提出很快引发了计算机科学领域关于应用反射性的研究.它首先被程序 ...
- python之面向对象函数与方法,反射,双下方法
一.函数和方法 1.函数和方法的区别 函数: 全都是显性传参,手动传参,与对象无关 方法: 存在隐性传参,与对象有关 1.1通过函数名可以判断 len()就是函数 str.count()就是方法 de ...
- day27:反射和双下方法
1, # 面向对象的三大特性:继承,多态和封装 # 继承: # 单继承: **** # 父类(超类,基类) # 子类(派生类) 派生方法和派生属性 # 子类的对象在调用方法和属性:先用自己的,自己没有 ...
- day26——tyoe元类与object的联系、反射、函数与方法的区别、双下方法
day26 type元类与object联系 type 获取对象从属于的类 python 中一切皆对象, 类在某种意义上也是一个对象,python中自己定义的类,以及大部分内置类,都是由type元类(构 ...
- Python进阶----反射(四个方法),函数vs方法(模块types 与 instance()方法校验 ),双下方法的研究
Python进阶----反射(四个方法),函数vs方法(模块types 与 instance()方法校验 ),双下方法的研究 一丶反射 什么是反射: 反射的概念是由Smith在1982年首次提出的 ...
- Python反射和内置方法(双下方法)
Python反射和内置方法(双下方法) 一.反射 什么是反射 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力(自省).这一概念的提出很快引发 ...
- Python面向对象06 /元类type、反射、函数与类的区别、特殊的双下方法
Python面向对象06 /元类type.反射.函数与类的区别.特殊的双下方法 目录 Python面向对象06 /元类type.反射.函数与类的区别.特殊的双下方法 1. 元类type 2. 反射 3 ...
- python 面向对象专题(六):元类type、反射、函数与类的区别、特殊的双下方法
目录 Python面向对象06 /元类type.反射.函数与类的区别.特殊的双下方法 1. 元类type 2. 反射 3. 函数与类的区别 4. 特殊的双下方法 1. 元类type type:获取对象 ...
随机推荐
- idea 执行maven 命令
如果当前账号不是超级管理员,这边需要执行系统用户变量, 输入安装文件bin路径 参考:https://blog.csdn.net/qq_19167629/article/details/7958490 ...
- 优秀的 Go 存储开源项目和库
可以看到,今年谷歌家的 Go 编程语言流行度有着惊人的上升趋势,其发展也是越来越好,因此本文整理了一些优秀的 Go 存储相关开源项目和库,一起分享,一起学习. 存储服务器(Storage Server ...
- log4j日志输出级别变更
1. 现阶段log4j日志输出配置 示例:基础服务日志配置 #DEBUG < INFO < WARN < ERROR < FATAL\u65E5\u5FD7\u7684\u ...
- 一种比较low的linux的hung分析
在调试一个功能的时候,发现了两种hung,以前认为的hung肯定是softlock导致的,后来才发现不一定要有lock这种结构,但是有类似于锁的功能的时候,也可能触发hung,为了避免大家走弯路,故记 ...
- qurtz.net(转载)
Quartz+TopShelf实现Windows服务作业调度 Quartz:首先我贴出来了两段代码(下方),可以看出,首先会根据配置文件(quartz.config),包装出一个Quartz.Co ...
- RabbitMQ系列教程之七:RabbitMQ的 C# 客户端 API 的简介(转载)
RabbitMQ系列教程之七:RabbitMQ的 C# 客户端 API 的简介 今天这篇博文是我翻译的RabbitMQ的最后一篇文章了,介绍一下RabbitMQ的C#开发的接口.好了,言归正传吧. N ...
- Linux创建SSH信任关系
Linux服务器创建信任关系可以解决远程执行命令.远程传输文件多次手工输入的麻烦.可以实现环境一键打包备份. 测试环境 SuSE 手工创建 假设服务器A与B间要建立信任关系.用户想从服务器A免密码登录 ...
- Android内存优化相关
Android的内存管理方式 Android系统内存分配与回收方式 一个APP通常就是一个进程对应一个虚拟机 GC只在Heap剩余空间不够时才去垃圾回收 GC触发时,所有线程都会被暂停!!! APP内 ...
- Android Studio3.1.2编译时Java Compiler出错:Warning: Failed to parse host proxy3.bj...
删除gradle.properties中的代理设置... #移除下面配置systemProp.http.proxyHost=proxy3.bj.petrochina systemProp.http.p ...
- 18.4 运行脚本 sudo ./launcher.sh 必须先给他权限 才能使用
我们发现我们每次启动服务都要打一大堆命令,ng build --watch ,nodemon server.js ,等等 凡是重复的工作,我们要可以代码完成 要想运行它呢 你必须将你运行的上述(脚本中 ...