0418 面向对象进阶 反射内置函数

绑定:
class
A: def func1(self):pass # 对象与方法之间的绑定 def func4(self): pass # 对象与方法之间的绑定 @classmethod def func2(cls): pass # 类与方法之间的绑定 @staticmethod def func3(): pass
a = A()
b = A()

普通方法 对象和类绑定的过程
print(A.func1) <function A.func1 at 0x02189660>
print(a.func1) <bound method A.func1 of <__main__.A object at 0x0217BD70>>
print(b.func1) <bound method A.func1 of <__main__.A object at 0x0217BD90>>

类方法 由于不适用对象内存空间中的属性,所以不会将对象和方法绑在一起
而是将类和方法绑在一起
print(A.func2)
print(a.func2) # 对象能找到类 类里面绑着方法
print(b.func2) 都是<bound method A.func2 of <class '__main__.A'>>

静态方法 不是绑定方法 没有和对象或者类发生任何绑定关系
print(A.func3)  <function A.func3 at 0x021D95D0>
print(a.func3)  <function A.func3 at 0x021D95D0>
print(b.func3)  <function A.func3 at 0x021D95D0>

 isinstance和issubclass

isinstance
判断一个对象和一个类有没有血缘关系
class A:pass
class B(A):pass
class C(B):pass
a=A()
b=B()
c=C()
print(isinstance(c,B)) True
print(isinstance(B,A)) False
print(isinstance(a,A))
print(isinstance(a,B)) # 能够检测到继承关系
print(type(a) is A)
print(type(a) is B) # type只单纯的判断类

issubclass
print(issubclass(C,B))  True
print(issubclass(A,B))  False
issubclass(子类名,父类名) 如果返回True,说明有继承关系
反射
正常情况下如果可以拿到这个变量 那么如有有这个变量的字符串形式 就是用反射可以获取到这个值
使用字符串数据类型的变量名 访问一个命名空间中的名字
找一个属性 ,直接就可以找到这个属性的值
找一个方法 ,找到的是这个方法的内存地址
hasattr() 判断一个命名空间中有没有这个名字
getattr() 从命名空间中获取这个名字对应的值

类中的反射
类可以获取类中的属性和方法
class A:
role = 'Person'
def func(self):
print('666')
a = A()
if hasattr(A,'role'):
print(getattr(A,'role')) # 从A的命名空间里找一个属性 ,直接就可以找到这个属性的值
if hasattr(A,'func'):
f = getattr(A,'func');f(1)# 从A的命名空间里找一个方法 ,找到的是这个方法的内存地址
getattr(A, 'func')(1)
对象使用对象能用的方法和属性
class A:
def __init__(self,age):
self.age = age
def func(self):
print(123)
a = A(100)
print(getattr(a,'age')) 100
getattr(a,'func')() 123

模块使用模块中的名字,从自己所在的模块中使用自己名字
def login():

print('登录')
def register():
print('注册')
import sys # 和python解释器相关的内容都在sys里
print(sys.modules['__main__'])
func = input('>>>')
if hasattr(sys.modules['__main__'],func):
getattr(sys.modules['__main__'],func)() 登录
类使用类命名空间中的名字
getattr(类名,'名字')
对象使用对象能用的方法和属性
getattr(对象名,'名字')
模块使用模块中的名字
导入模块
getattr(模块名,'名字')
import os ; getattr(os,'rename')('user','user_info')
从自己所在的模块中使用自己名字
import sys
getattr(sys.modules['__main__'],名字)

getattr一定要和hasattr配合使用

反射 4个内置函数
getattr ******
hasattr ******
setattr # 修改和新建 **
delattr # 删除一个属性 *
增删改 对象属性
class
A: def __init__(self,name): self.name = name def func(self):print(666) a =A('alex') print(a.name)  alex setattr(a,'name','egon') 修改属性 print(a.__dict__)  {'name': 'egon'} setattr(a,'age',73)    增加属性 print(a.__dict__)  {'name': 'egon', 'age': 73} delattr(a,'age')      删除属性 print(a.__dict__)  {'name': 'egon'}
增删改 方法
class A:
def __init__(self,name):
self.name = name

def wahaha(self):
print('wahahahahaha')

def qqxing(self):
print('qqqqqxing')

a = A('alex')
# setattr(A,'qqxing',qqxing)
setattr(a,'qqxing',qqxing)
# print(a.__dict__)
a.qqxing(a)
 
原文地址:https://www.cnblogs.com/Mr-Murray/p/8875868.html