判断一个对象有没有血缘关系:isinstance() 里面写的是字类对象和父类名用来判断他们的关系

issubclass()是用来判断两个类是不是有继承的关系 ,括号内 写字类名和父类名  可以判断出字类和父类或者爷爷类的关系


class A:
role = "Person"
def __init__(self):
self.money = 500
def func(self):
print("*"*10)
a = A()
print(a.func) #得到是内存地址
# print(a.func())
getattr(a,'func')()
print(getattr(a, 'money'))

class Foo(object):
def __init__(self , name):
self.name = name class Doo(Foo):
def __init__(self,name, age): super().__init__(name)
self.age = age
f = Foo('alex')
d = Doo('laowang ',14)
class B:pass
class A(B):pass
a = A()
print(isinstance(a,A))
print(isinstance(a,B)) #isinstance 判断一个对象和一个类有没有血缘关系
isinstance()
class C:pass
class D(C):pass
print(issubclass(C,D))
print(issubclass(D,C))

反射的4个内置函数
getattr() ******
hasattr() ******
strattr() 修改和新建
delattr() 删除一个属性

反射是;使用字符串数据类型的变量名来使用变量

hasattr()  判断一个命名空间中有没有这个名字
getattr()从命令空间内获取这个名字对应的值 从命令空间中获取这个名字的值

hasattr(object, name)
判断一个对象里面是否有name属性或者name方法,返回BOOL值,有name特性返回True, 否则返回False。
需要注意的是name要用括号括起来

getattr(object, name[,default])
获取对象object的属性或者方法,如果存在打印出来,如果不存在就报错,打印出默认值,默认值可选。
需要注意的是,如果是返回的对象的方法,返回的是方法的内存地址,如果需要运行这个方法,
可以在后面添加一对括号。

class A:
role = 'Person' print(getattr(A,'role')) 使用字符串数据类型的变量 访问一个命名空间中的名字
class B:
l = '你好'
def func(self):
print(111)
print(getattr(B,'l'))
getattr(B,'func')(1) #从类中找方法找的是它的内存地址 你需要加上括号才能调用它 并且传参 self
找一个属性 直接就可以找到这个属性的值
找一个方法找到的就是这个方法的内存地址你可以对这个内存地址进行赋值来及逆行调用
getattr(B,'func')(3)
print(hasattr(B,'l'))
print(hasattr(B, 'v'))
ret = input('>>>')
if hasattr(B , ret):
print(getattr(B, ret))
hasattr() 判断一个命名空间中有没有这个名字
getattr()从命令空间内获取这个名字对应的值
从命令空间中获取这个名字的值

其实eval类似getattr()方法 可以直接取值  但是一般除了取文件中的内容是不能用eval的  是防止一些错乱所以这个时候就有了反射getattr()方法

不论 hasattr()还是getattr()你所查询判断的内容必须是字符串类型的就是用引号括起来的 就好比你从文件中取出文件但是你的文件是什么类型的呢 是str的 所以需要用引号括起来

hasattr是用来判断  getattr使用来获取的  getattr()来获取的内容是方法的时候必须在最后加上括号括号括号(重要的说三遍)不然会不执行 因为方法执行必须加括号,调用的时候是对象的时候括号内不需要传递参数,如果是类的时候就不需要传递参数

class A:
role = 'Person'
def func(self):
print('*'*self)
a = A()
print(hasattr(a,'func'))
if hasattr(a,'func'):
getattr(A, 'func')(3) if hasattr(A,'func') :
getattr(a,'func')(5)
import os
getattr(os,rename)(old, new) a = 1
b = 2
def login():
print('执行了login')
def register():
print('执行了register方法')
import sys
# sys.modules['__main__'],
func = input('>>').strip()
getattr(sys.modules['__main__'],func)()
class A:
def b(self):
print(111) a = A()
fun = input('>>').strip()
if hasattr(a,'func'):
getattr(a,'func')(1)
else :
print(2)
class A:
def __init__(self, name, age, sex, cls):
self.name = name
self.age = age
self.sex = sex
self.cls = cls def __len__(self):
return 5 a = A('a',33, 'nv', 2)
print(len(a)) class D:
role = '你好'
def func(self):
print(111) d = D() # print(hasattr(d,'role'))
info = input('》》').strip()
if hasattr(d,info): #hasattr用来判断你的内容是不是存储的有这个变量
getattr(D,'func')(1)
class B:pass
class A(B):pass
a = A()
print(isinstance(a,A))
print(isinstance(a,B)) #检测到继承的关系
print(isinstance(A,B)) #只能用字类对下个和父类名来判断
print(type(a)is A) #type只能狗单纯的判断类
print(type(a) is B)
判断一个类和另外一个类有没有血缘关系
isinstance()
class B:pass
class C(B):pass
class D(C) :pass
print(issubclass(C,D))
print(issubclass(D,C)) #issubclass判断是不是继承
# isinstance()只可以用字类对象和父类名来判断 ,因为判断是不是有血缘关系
print(issubclass(B,C)) #继承和被继承者不能颠倒
class A:
role = 'ni'
def func(self):
print(666)
a = A()
info = input('>>').strip()
if hasattr(a,info):
getattr(a,info)() #通过对象是不用传递参数的 但是通过类 是需要传递参数的
def login():
print('执行了login方法')
def register():
print('执行了注册功能') import sys
func = input('>>').strip()
if hasattr(sys.modules['__main__'],func):
getattr(sys.modules['__main__'], func)() def login():
print('您在执行login的操作')
def register():
print('您在执行reguster的操作')
import sys
# print(sys.modules['__main__'])
func = input('》》').strip()
if hasattr(sys.modules['__main__'], func):
getattr(sys.modules['__main__'],func)()
import time
# time.time()
print(getattr(time,'time')())
role = 123
print(eval('role')) #但是这个eval除了是去除文件中的信息的时候用到 其他的时候一般是禁止使用的
class A:
role = 'Person'
def func(self):
print('*'*self) ret = input('>>').strip()
# print(A.__dict__[ret]) #打印你所输入的类的属性的对应的值 因为你的内容是以字典的形式存储起来的 那么就用__dict__来查看
print(getattr(A,ret)) #从a的命名空间里找一个属性 直接就可以找到这个属性的值
print(getattr(A,'role'))
f = getattr(A, 'func');f(10) #也可以这样的简写 从A的命名空间里找一个方法 招待的就是这个方法的内存地址值
A.func(1)
反射you
正常情况下如果可以拿到这个变量 那么如果有有这个变量的字符串形式 就是可以用反射获取到这个值
使用字符串类型的变量名 访问一个命名空间中的名字
找一个属性 直接就可以找到这个属性的值
找到一个方法直接找到的是这个方法的内存的地址
就是你找不论变量还是方法必须是通过字符串类型的来查找 因为你存储文件也是以字符串类型的形式来查找 所以你直接用getattr来查找必须加引号
hasattr() 判断这个空间内有没有这个名字
getattr从命名空间中获取这个名字对应的值
类的反射就是 类可以获取类中的属性和方法
class A:
role = 'Perosn'
def func(self):
print('*'*self) a = A()
# print(getattr(a, role)) #你需要以字符串的 类型来查找不然找不到会报错,因为就好比你文件的内容也是以字符串的类型存储的
if hasattr(a,'func'):
getattr(A,'func')(10) getattr()

用getattr验证对象是不是含有这个方法 那么不需要传递参数 但是类名验证需要传递参数

#第一种验证对象中含有这个方法
class A:
def b(self):
print(111)
a = A()
func = input('>>').strip()
if hasattr(a,func): # 验证对象中是否有这个
getattr(a,func)() # 因为是对象名验证的所以不需要传递参数
else:
print(333) #下面验证对象是否含有
class A:
def b(self):
print(111)
a = A()
func = input('>>').strip()
# if hasattr(A, func):
# getattr(A,func)() #不传递参数直接会报错 缺少self参数
if hasattr(A, func):
getattr(A, func)(a) #如果没有特殊规定这个参数可以随意传递
else :
print(333)

类使用类命名空间中的名字
getattr(类名,'名字')
对象使用对象能用的方法和属性
getattr(对象名, '名字')
模块使用模块中的名字
导入模块
getattr(模块名, '名字')

用getattr查看当前位置下的内容地址: (找到地址我们可以根据地址做很多有意义的事)

import sys
def bb():
print(666) func = input('>>').strip()
if hasattr(sys.modules['__main__'], func): #判读当前位置中是否有func的内容 sys.modules['__main__']是显示当前位置
getattr(sys.modules['__main__'],func)() # 找到位置后根据这个位置来查找这个地址下的方法或者属性 这个事查找方法 别忘了加()

也可以获取模块中内容

def login():
print('执行login功能') def register():
print('执行register功能') import sys # 和python解释器相关的内容都在sys里
print(sys.modules['__main__'])
func = input('>>>')
if hasattr(sys.modules['__main__'],func):
getattr(sys.modules['__main__'],func)()
import time
time.time()
print(getattr(time, 'time')())
import os 
os.rename('old','new')
getattr(os,'rename')('old','new') #获取os.rename的功能

内置函数__len__和内置方法len()是唯一对应的关系

就是__len_-中的内容都可以通过len来得到 不论任何值 这个时候如果len得到的是__len__中的内容就不是求长度了

class A:
def __init__(self, name, age, sex, cls):
self.name = name
self.age = age
self.sex = sex
self.cls = cls
def __len__(self):
# return len(self.__dict__)
return 111
a1 = A('alex', 81, '不详', 2)
print(len(a1)) #这个时候就不是得到长度了而是类中的__len__中的返回值

内置的东西
# 都和内置的方法有着千丝万缕的联系


# 字典的存储
# hash


class A:
def __init__(self,name,age,sex,cls):
self.name = name
self.age = age
self.sex = sex
self.cls = cls
def __hash__(self):
return 0
a1 = A('alex',81,'不详',2)
print(hash(a1))

 

面向对象进阶----->反射 getattr 和hasattr方法的更多相关文章

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

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

  2. Python之面向对象进阶------反射(Day26)

    一 classmethod class Classmethod_Demo(): role = 'dog' @classmethod def func(cls): print(cls.role) Cla ...

  3. python面向对象之反射和内置方法

    一.静态方法(staticmethod)和类方法(classmethod) 类方法:有个默认参数cls,并且可以直接用类名去调用,可以与类属性交互(也就是可以使用类属性) 静态方法:让类里的方法直接被 ...

  4. Python之面向对象之反射、内置方法

    一.静态方法(staticmethod)和类方法(classmethod) 类方法:有个默认参数cls,并且可以直接用类名去调用,可以与类属性交互(也就是可以使用类属性) 静态方法:让类里的方法直接被 ...

  5. python面向对象进阶 反射 单例模式 以及python实现类似java接口功能

    本篇将详细介绍Python 类的成员.成员修饰符.类的特殊成员. 类的成员 类的成员可以分为三大类:字段.方法和特性. 注:所有成员中,只有普通字段的内容保存对象中,即:根据此类创建了多少对象,在内存 ...

  6. python全栈开发day23-面向对象高级:反射(getattr、hasattr、setattr、delattr)、__call__、__len__、__str__、__repr__、__hash__、__eq__、isinstance、issubclass

    一.今日内容总结 1.反射 使用字符串数据类型的变量名来操作一个变量的值. #使用反射获取某个命名空间中的值, #需要 #有一个变量指向这个命名空间 #字符串数据类型的名字 #再使用getattr获取 ...

  7. 反射getattr,hasattr,setattr,delattr

    通过字符串映射或修改程序运行时的状态.属性.方法, 有以下4个方法 getattr(object, name_str, default=None) 根据字符串name_str去获取obj对象里的方法内 ...

  8. 面向对象进阶-类的内置方法 __str__ 、__repr__、__len__、__del__、__call__(三)

    # 内置的类方法 和 内置的函数之间有着千丝万缕的联系# 双下方法# obj.__str__ str(obj)# obj.__repr__ repr(obj) # def __str__(self): ...

  9. day26、面向对象进阶:多态、封装、反射

    一.多态 什么是多态: 类的继承有两层意义:1.改变 2.扩展 多态就是类的这两层意义的一个具体的实现机. 即:调用不同类实例化的对象,下的相同的方法,实现的过程不一样 python中的标准类型就是多 ...

随机推荐

  1. EJB与JavaBean

    JavaBean是一个组件,而EJB就是一个组建框架.JavaBean面向的是业务逻辑和表示层的显示,通过编写一个JavaBean,可以将业务逻辑的事件和事务都放在其中,然后通过它的变量属性将所需要的 ...

  2. 14.Promise对象

    1.Promise的含义 Promise 是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理和更强大.它由社区最早提出和实现,ES6将其写进了语言标准,统一了用法,原生提供了Pro ...

  3. Struts html(标签)

    一 <html:form> <html:form>用来创建表单,<html:form>必须包含一个action属性,否则JSP会抛出一个异常. 1.常用属性: Ac ...

  4. Redis之数据类型Sting字符串

    Redis String(字符串) string是redis最基本的类型,你可以理解成与Memcached一模一样的类型,一个key对应一个value. string类型是二进制安全的.意思是redi ...

  5. JMS、AMQP和MQTT主要特性

    今天无意中看到mq的原理,才发现activeMq与ribbMq的原理是不一样的.前者是JMS的实现,后者是AMQP的实现... 原理简介:https://www.cnblogs.com/zhangyu ...

  6. Thread -- Request

    Servlet容器应该绝大部分(有可能全部)是Thread per Request,每个请求一个线程.此外有Thread per Connection,应该不是用于Servlet容器.请见 How a ...

  7. gulp教程之gulp中文API

    1.gulp.src(globs[, options]) 1.1.说明:src方法是指定需要处理的源文件的路径,gulp借鉴了Unix操作系统的管道(pipe)思想,前一级的输出,直接变成后一级的输入 ...

  8. android应用执行需要root权限的shell命令

    导入jar包:http://blog.csdn.net/zhw1551706847/article/details/77709142 RootTools:http://blog.csdn.net/st ...

  9. python——高级特性

    切片操作符 Python提供了切片(Slice)操作符,切片操作十分有用,可以通过切片轻松取出某一段数列.比如前10个数: #slice切片操作符 取前10个元素 L=list(range(0,100 ...

  10. D3基础--数轴

    转载请注明出处! 概述: 与比例尺类似,D3的数轴实际上也使用来定义参数的函数.但与比例尺不同的是,调用数轴函数并不会返回值,而是会生成数轴相关的可见元素.包括:轴线,标签和刻度. 但是要注意数轴函数 ...