本篇主要介绍面向对象编程中类的魔法属性,这些魔法属性均有其特殊的功能,即执行某些操作时,会自动触发这些魔法方法的执行,了解这些魔法方法可以更好的了解面向对象编程的实现原理;
在学习魔法方法之前,我们先了解其他两个方法:
isinstance() 和 issubclass()
class A(object): pass class B(A): pass b = B() # isinstance(o,c) -- 判断前者是否为后者所创建的对象 print(isinstance(b,A)) # True print(isinstance(b,B)) # True # issubclass --判断前者是否为后者的子类 print(issubclass(B,A)) # True
反射:hasattr、getattr、setattr、delattr四个内置函数
反射,又称自省(自我反省),该概念是由Smith于1982首次提出的,是指主要是指程序可以访问、检测和修改它本身状态或行为的一种能力;
class Programmer(object): """定义一个程序员类""" character = "intelligent" # 特点:聪明 def __init__(self,name,age,gender): self.name = name self.age = age self.gender = gender def write_code(self): # 写代码 pass def debug(self): #调试 pass p = Programmer("little-five",22,"male") # hasttr - 查看该对象是否可以使用该属性或者方法 print(hasattr(p,"name")) print(hasattr(p,"debug")) # getattr - 获取对象属性 print(getattr(p,"write_code")) #<bound method Programmer.write_code of <__main__.Programmer object at 0x0000016F87ABBFD0>> print(getattr(p,"character")) # == p.character # 可以指定第三个参数,当属性不存在时返回该值,而不会报错 # print(getattr(p,"balabala")) # 报错 print(getattr(p,"balabala","不存在的")) # setattr -修改对象属性 setattr(Programmer,"character","handsome") # == Programmer.character = "handsome" print(p.character) # handsome # delattr - 删除该属性 delattr(p,"name") # == del p.name print(p.__dict__) #{'age': 22, 'gender': 'male'},name没啦 delattr(Programmer,"debug") print(Programmer.__dict__) #debug属性没啦