首页 > 其他分享 >反射的内置方法

反射的内置方法

时间:2023-10-30 11:45:59浏览次数:23  
标签:__ 反射 内置 name self item print 方法 def

内置方法

__str__

1.如果不重写__str__ return会打印出内存地址

2. print() 打印的时候, 会自动触发该函数的执行

如果重写了,会打印出你想要的

class Foo:
    def __init__(self, name):
        self.name=name
    def __str__(self):
        return '['+self.name+']'
       
f = Foo('nick')
# print(f.__str__())
# 相当于上面那句
print(f)
l = [1,2,3,4]
# 本质其实也是调用list的__str__方法
print(l)

__repr____str__ 类似,但它是在交互式命令下直接写变量名,会执行__repr__ (了解)

image-20231020154647051

小结:

str函数或者print函数调用的是obj.__str__()

repr函数或者交互式解释器调用的是obj.repr__()

注意:

如果__str__没有被定义, 那么就会使用__repr__来代替输出

__str__和__repr__方法的返回值都都必须是字符串

重要( __setattr__ , __delattr__, __getattr__ : 对象加 (.)点 就会触发)

__getattr__ : 如果去对象中取属性,一但取不到,会进入__getattr__; 对象加 (.) 赋值或修改值会触发

__setattr__ : 如果去对象中赋值属性,一但取不到,会进入__setattr__ ; 对象加 (.) 获取值, 如果取不到, 会触发

__delattr__: 如果删除对象中的属性, 会进入__delattr__

# 点拦截方法
class Foo:
    def __init__(self, name):
        self.name = name

    def __getattr__(self, item):
        print('hhhh')
        return '你沙雕啊,没有这个字段'
   	
    def __setattr__(self, key, value):
        print('yyyy')
       
    def __delattr__(self, item):
        print('bbbb')


f = Foo('nick')
print(f.name)
print(f.age)
print(f.__dict__)
print(f.name)
f.sex='male'

def f.name
print(f.__dict__)		# 会发现没删掉

字典继承例子

# 原来的字典使用方法
di = dict(name='hys', age=17)
print(di)

# 写一个类继承字典, 可以让他(.)取值, 也可以括号取值
class Mydict(dict):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
       
    def __getattr__(self, item):
        print(item)
        return self[item]
    
    def __setattr__(self, key, value):
        self[key] = value
       
di = Mydict(name='hys', age=16)
# 取值的两种方法
print(di['name'])
print(di.age)
# 赋值的两种方法
di.like='milk'
print(di.like)
di['sex']='male'
print(di.sex)

例子总结:虽然他本质上也是,但是在这里我就能控制这些过程

__item__系列:对象通过[ ] 中括号取值,赋值, 删除值的时候,会调用

class Foo:
    def __init__(self,name):
        self.name=name

    def __getitem__(self, item):
        # 一般用这种反射的方式, 但实际这两个意思是一样的
        name = getitem(self, item)
        return name
        # 一般不会用这种方式
        return self.__dict__[item]

    def __setitem__(self, key, value):
        self.__dict__[key]=value
    def __delitem__(self, key):
        print('del obj[key]时,我执行')
        self.__dict__.pop(key)
         
f1=Foo('sb')
# 当我取值的时候, 会触发__getitem__方法
f1['age']=18
# 当我赋值时,会触发__setitem__方法
f1.age1=19
# 当我删除值的时候,会触发__delitem__方法
del f1.age1
del f1['age']
f1['name']='alex'
print(f1.__dict__)

__call__ 对象加括号 或 类加括号会调用它

class Foo:
    def __call__(self):
        print('xxxxx')
       
f = Foo()
f()

__ enter__和__exit__

# 上下文管理器, 本质原理;  with 顶头写会自动调用__exit__方法
with open() as f:
    pass

递归问题

class Foo():
    def __init__(self, name):
        self.name = name
       
    def __setattr__(self, key, value):
        print('xxxx')
        # 这种方法有问题!	会到达递归的最大深度
        setattr(self, key, value)
       
    def __getattr__(self, item):
        return '没有值'		# 因为是取不到才跳到这里, 所以再写个反射还是取不到
   
f = Foo('nick')

标签:__,反射,内置,name,self,item,print,方法,def
From: https://www.cnblogs.com/hanyingshuo/p/17797415.html

相关文章

  • 反射的四种用法
    反射的总结:就是通过字符串来获取,删除和设置对象的属性或方法反射:反射是动态语言的一个重要特点,它允许你在运行时检查对象的属性和方法,以及修改它们。这为元编程和编写通用代码提供了支持。什么是反射反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问、检测和修......
  • 绑定方法和非绑定方法
    绑定方法 对象绑定方法/类的绑定方法对象绑定方法:定义在类内部,没有装饰器装饰的方法,都是对象的绑定方法需要对象来调用,对象调用的时候,会把自身传入classPerson:def__init__(slef,name='my'):self.name=nameself.age=17defchange_name(s......
  • scrum开发方法
    一、Scrum概述Scrum本指橄榄球运动中的“争球”的动作——团队通力合作,在场地内传球。这个过程需要认真配合、信念一致、目标明确。这个过程完美体现了对一个团队的所有要求。用Scrum命名一种开发过程,比喻开发团队在开发一个项目时,像打橄榄球一样迅速、激情,人人你争我抢地完成......
  • 按Value对Map进行排序,技术大佬们都在用这个方法
    在Java中,Map的排序一般会根据Key或者Value来进行。按照Value对Map进行排序,通常会用在以下几种场景。1.数据可视化:如果你正在创建一个数据可视化工具,你可能会需要根据数据的值来进行排序。例如,你可能有一个表示员工工资的Map,你想要根据工资值来对员工进行排序,并在图表中展示。2.......
  • 性能测试的实践痛点和解决方法
    昨天有同学找我咨询了一个性能测试相关的问题,他说:他们公司的性能测试实践目前基本成为了形式主义,除了版本迭代时候的单系统单接口压测,没有其他亮点,领导也不重视。想做一些异常测试和高可用测试,体现自己的价值,但又不知道从何入手,该怎么解决当下不被重视的现状?其实很多测试同......
  • java中native源码查找方法
    以Object的hashCode()方法为例:1.下载openjdk源码或从github中查找,这里以github中查找为例;2.GitHub中查找https://github.com/bpupadhyaya/openjdk-8/tree/master/hotspot源码;3.搜索到Object.c源码文件,并查找hashCode字眼,如下所示: 4.由上可知,hashCode方法实际是调用的jvm.c......
  • Java基础 反射获取构造方法
    在Java中,万物皆对象。比如,字节码文件可以看作是Class这个类的对象;Constructor这个类是用来描述构造方法的,所以这个类的对象就表示构造方法的对象;Field这个类是用来描述成员变量的,所以这个类的对象就表示成员变量的对象;Method 这个类是用来描述成员方法的,所以这个类的对......
  • Java基础 反射
     反射允许对封装类的字段(成员变量)、方法(成员方法)和构造函数(构造方法)的信息进行编程访问  获取字段(成员变量)、成员方法和构造方法的时候,我们不是从Java文件中获取的,而是从class字节码文件当中获取的所以我们首先要先学习如何获取class字节码文件的对象 ......
  • java中方法内的局部变量是在什么时候被创建的
    2023.10.291.不是局部变量在该方法被执行/调用时创建,而是应该为在该变量被声明并赋值时创建,可以理解为“当代码执行到该变量被赋值的代码时才被创建”。栈会为每个方法在运行的时候分配一块独立的栈帧内存区域,栈帧又包含“局部变量表”、“操作数栈”、“动态链接”以及“方法出......
  • python面向对象-学习笔记(六、方法相关的补充)
    私有化方法私有方法classPerson:__age=18#私有方法def__run(self):print("run")#def_Person__run(self):#print("Personrun")p=Person()#p.__run()#p._Person__run()print(Person.__dict__)内置特殊方法......