面向对象—反射
Posted 郭圆
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面向对象—反射相关的知识,希望对你有一定的参考价值。
内置函数:
1.isinstance:判断一个对象和一个类有没有血缘关系
class A:pass class B(A):pass a = B() print(isinstance(a,B)) #True print(isinstance(a,A)) #True print(type(a) is B) #True print(type(a) is A) #False
2.issubclass(子类名,父类名):检测继承关系,返回True说明与继承关系
class A:pass class B(A):pass class C(B):pass print(issubclass(C,B))#True print(issubclass(C,A))#True
反射
反射:通过字符串的形式操作对象相关的属性,使用字符串数据类型的变量名访问一个命名空间中的名字,找一个属性直接就可以找到这个属性的值,找一个方法找到的是这个方法的内存地址。
反射的4个内置函数:
1.hasatter:判断一个命名空间里是否有一个属性或方法
class A: role = ‘Person‘ def func(self): print(‘*‘*self) print(hasattr(A,‘r‘)) # False print(hasattr(A,‘role‘)) # True print(hasattr(A,‘func‘)) # True ret = input(‘>>>‘) if hasattr(A,ret): print(getattr(A,ret)) if hasattr(A,ret): func = getattr(A,ret) func(12)
2.getatter:从一个命名空间里获取一个属性或方法的值,方法需要调用。
class A: role = ‘Person‘ def func(self): print(‘*‘*self) ret = input(‘>>>‘) print(getattr(A,‘role‘)) #从A的命名空间里找一个属性,直接可以找到这个属性的值 f = getattr(A,‘func‘);f(3) #从A的命名空间里找一个方法,找到的是这个方法的内存地址 A.func(1)
- 类使用类命名空间中的名字:getattr(类名,‘名字‘)
- 对象使用对象能用的方法和属性:getattr(对象名,‘名字‘)
-
class A: role = ‘Person‘ def __init__(self): self.money = 500 def func(self): print(‘*‘*5) a = A() getattr(a,‘func‘)() print(getattr(a,‘money‘)) #getattr(对象名,‘名字‘)
- 模块使用模块中的名字:getattr(模块名,‘名字‘)
-
import time time.time() print(time.time) print(getattr(time,‘time‘)) import os getattr(os,‘rename‘)(‘user‘,‘user_info‘)
- 自己所在的模块中使用自己的名字:impoart sys getattr(sys.modules[‘__main__‘],名字)
-
def login(): print(‘执行login功能‘) def register(): print(‘执行register功能‘) import sys #和python解释器相关的内容都在sys模块里 print(sys.modules[‘__main__‘]) # 找到自己所在的模块(py文件) func = input(‘>>>‘) getattr(sys.modules[‘__main__‘],func)()
3.setatter:增加和修改
4.delatter:删除
class A: def __init__(self,name): self.name = name def wahaha(self): print(‘wahahaha‘) a = A(‘alex‘) # a.age = 18 # print(a.__dict__) setattr(a,‘age‘,18) # 增加一个属性 print(a.__dict__) # {‘age‘: 18, ‘name‘: ‘alex‘} setattr(a,‘name‘,‘taibao‘) # 修改一个属性 print(a.__dict__)# {‘age‘: 18, ‘name‘: ‘taibao‘} delattr(a,‘age‘) #删除一个属性 print(a.__dict__) #{‘name‘: ‘taibao‘}
内置方法
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__) a = A(‘alex‘,18,‘man‘,2) print(len(a)) # 4 a.hobby = ‘烫头‘ print(len(a)) # 5
hash()内置方法和内置函数__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 1 a = A(‘alex‘,18,‘man‘,2) print(hash(a)) # 1
以上是关于面向对象—反射的主要内容,如果未能解决你的问题,请参考以下文章