python-反射-元类-单例模式

本文介绍了Python中的反射机制,包括isinstance、issubclass、hasattr、getattr、setattr和delattr的使用。接着讲解了str方法、del操作在对象销毁时的作用,以及何时使用它们。还探讨了exec方法的执行Python代码的功能。接着深入元类,解释了元类的概念和如何通过元类控制类的创建过程。最后,文章详细阐述了单例模式的概念及其在Python中的实现。
摘要由CSDN通过智能技术生成

一、isinstance和issubclass

# 判断某个对象是不是某个类的实例
# isinstance()
class Person:
    pass
class Student(Person):
    pass

stu = Student()
print(isinstance(stu,Student)) #True

#判断是不是子类
#issubclass()
print(issubclass(Student,Person)) #True

二、反射

  1. 什么是反射:其实说的是反省,简单的说就是对象要具备一种修正错误的能力

    hasattr 是否存在某个属性

    getattr 获取某个属性的值

    setattr 设置某个属性的值

    delattr 删除某个属性

  2. 什么时候用反射:

    如果在编写代码期间,就能明确知道我要访问的属性,没有必要使用反射

    如果在编写代码期间,无法明确知道我要访问的属性,这时就应该使用反射

class Student:
    def __init__(self,name,sex,age):
        self.name = name
        self.age = age
        self.sex = sex

    def study(self):
        print("学生正在学习...")

stu = Student("矮根","woman",38)
print(stu.name) #矮根

#当你获取到一个对象,但是并不清楚对象的内部细节时,就需要使用反射了
def test(obj):
    if hasattr(obj,"name"):
        print(getattr(obj,"name","没有name属性"))
test(stu)

#设置属性的值
setattr(stu,"school","beijing")
print(getattr(stu,"school","没有学校属性")) #beijing

#删除属性的值
delattr(stu,"school")
print(getattr(stu,"school","没有学校属性")) #没有学校属性

#删除属性的值
delattr(stu,"age")
print(stu.age) 

练习:

class Student:
    def study(self):
        print("学习中....")

stu = Student()
res = getattr(stu,"study",None)
print(res)

def eat(self):
    print("正在吃饭...")
#可以通过反射的方式为对象增加一个方法,但是注意这样增加的方法就是一个普通函数,不会自动传值
setattr(stu,"eat",eat) #<function eat at 0x0000021994A82E18>
eat(stu) #正在吃饭...
========
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值