python--面向对象的特殊方法(反射,内置方法)
1.反射:hasattr,getattr,setattr,delattr
使用字符串数据类型的变量名来操作一个变量的值
使用反射获取某个命名空间中的值,
需要
有一个变量指向这个命名空间的
字符串数据类型的名字,
再使用getattr获取值,
如果是变量能直接获得结果
如果是函数,只能拿到内存地址,加上括号就是执行
使用类名反射 : 静态属性、类方法、静态方法
使用对象名反射 :对象属性、类中的普通方法
使用模块名反射 : 变量 函数 类
在自己所在的文件中反射全局变量 :getattr(sys.modules[__name__],'要反射的名字')
2.类的内置方法:
import mmm
print(mmm.a) # 直接使用模块调用模块中的变量
print(getattr(mmm,'a')) # 使用反射调用模块中的变量a
print(getattr(mmm,'b')) # 使用反射调用模块中的变量b
mmm.wahaha() # 直接使用模块调用模块中的函数
getattr(mmm,'wahaha')() # 使用反射调用模块中的函数
print(mmm.QQxing) # 直接使用模块获取类的内存地址
taibai = mmm.QQxing('光头') # 实例化模块中的类
taibai.ADCa() # 实例调用方法
cls = getattr(mmm,'QQxing') # 使用反射获取模块中的类
obj = cls('光头') # 使用反射得到的类进行实例化
print(obj)
getattr(obj,'ADCa')() # 使用反射调用类中的方法
对象加上(),可以出发这个类的__call__方法。
class Foo:
def __call__(self):
print('call')
Foo()()
obj = Foo()
obj() # 相当于调用__call__
内置函数的len函数是依赖类中的__len__
class Classes:
def __init__(self,student_lst):
self.student_lst = student_lst
def __len__(self):return len(self.student_lst)
# 某个类中有多少个属性???
obj = Wahaha(6,'haha',7)
print(len(obj.__dict__))
print(len(obj))
# __eq__ 是判断值是否相等的时候依赖__eq__的结果
# repr 和 str.
在没有实现__str__方法的情况下,__repr__能够完全替代__str__的功能
但是__str__不能代替__repr__的工作
在__repr__和__str__都存在的情况下:
__repr__方法 和 repr() %r都是息息相关的
__str__方法 和 str() print() %s 都是息息相关的