本篇主要介绍面向对象编程中类的魔法属性,这些魔法属性均有其特殊的功能,即执行某些操作时,会自动触发这些魔法方法的执行,了解这些魔法方法可以更好的了解面向对象编程的实现原理;

  在学习魔法方法之前,我们先了解其他两个方法:

 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属性没啦
反射

相关文章: