ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

11、反射、内置方法

2022-07-26 22:03:04  阅读:143  来源: 互联网

标签:11 反射 内置 name self age __ print class


11.1 反射

1、什么是反射

反射机制指的是在程序的运行状态中

对于任意一个类,都可以知道这个类的所有属性和方法;

对于任意一个对象,都能够调用他的任意方法和属性。

这种动态获取程序信息以及动态调用对象的功能称为反射机制。

2、为什么要用反射

函数接收到一个参数后,要去判断里面是否有属性可以去访问

3、如何实现反射

class People:
    def __init__(self,name,age,sex):
        self.name = name
        self.age = age
        self.sex = sex
        
    def say(self):
        pass


obj = People('upup',12,'男')

# 实现反射的步骤
# 1.先通过dir 查看出某一个对象下可以.出哪些属性来
print(dir(obj))

# 2.可以通过字符串反射到真正的属性上,得到属性值
# print(obj.__dict__[dir(obj)[-2]])

# 四个内置函数的使用
# hasatter() 判断某一个属性在不在对象里面
# print(hasattr(obj,'name'))  # True

# getattr() 获取属性
print(getattr(obj,'name'))  # upup

# setattr() 赋值属性
print(setattr(obj,'name','UP'))
print(obj.name)   # UP

# delattr() 删除属性
delattr(obj,'name')

# print(getattr(obj,'say'))

# 如果没有这个属性值,也不会报错的方式
if hasattr(10,'x'):
    print(getattr(10,'x'))
else:
    pass

print(getattr(10,'x',None))

if hasattr(10,'x'):
    setattr(obj,'x',12)
else:
    pass

11.2内置方法

1、什么是内置方法

定义在类内部,以两个下划线开头并以两个下划线结束的的方法

特点:会在某种情况下自动触发并执行

2、为何要使用内置方法

为了定制类、对象

3、如何使用内置方法

str方法

# __str__:会在对象被打印时自动触发,print功能打印的就是它的返回值,通常基于方法来定制对象的打印信息,该方法必须返回字符串类型
class People:
    def __init__(self,name,age,sex):
        self.name = name
        self.age = age
        self.sex = sex

    def __str__(self):
        print('%s:%s' % (self.name,self.age))
        return 'haha'

obj1 = People('upup',12,'男')
print(obj1)

# upup:12
# haha

del方法

# __del__:在清理对象时候触发,会先执行该方法
# 发起系统调用,告诉操作系统回收相关的系统资源

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

    def __del__(self):
        pass

obj1 = People('upup',12,'男')
print(obj1)

11.3元类

1、什么是元类

因为一切皆为对象,如果说类也是对象,元类就是用来实例化产生类的类

# 关系:元类---实例化---->类(People)---实例化---->对象(obj)
class People:
    def __init__(self,name,age):
        self.name=name
        self.age=age

    def say(self):
        print('%s:%s' %(self.name,self.name))


# print(People.__dict__)
# 如何得到对象
# obj=调用类()
obj=People('egon',18)
# print(type(obj))
# 如果说类也是对象
# People=调用类(。。。)

# 查看内置的元类:
# 1、type是内置的元类
# 2、我们用class关键字定义的所有的类以及内置的类都是由元类type实例化产生
print(type(People))
print(type(int))

class机制分析

# class 关键字创造类people的步骤
# 类有三大特征:
# 1.类名
class_name = 'People'
# 2.类的基类
class_bases = (object)
# 3.通过执行类体代码,拿到类的名称空间
class_dic = {}
class_body = """
def __init__(self,name,age):
    self.name=name
    self.age=age
def say(self):
    print('%s:%s' %(self.name,self.name))

"""
exec (class_body,{},class_dic)
print(class_dic)

# 4.调用元类,调用内置的元类
People = type(class_name,class_bases,class_dic)

标签:11,反射,内置,name,self,age,__,print,class
来源: https://www.cnblogs.com/xionghuan01/p/16522776.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有