类的内置方法(魔法方法):

凡是在类内部定义,以__开头__结尾的方法,都是类的内置方法,类的内置方法,会在满足某种条件下自动触发。

1.1__new__

	__new__:在___init__触发前,自动触发。调用该类时,内部会通过__new__产生一个新对象

	__init__:在调用类时自动触发。通过产生的对象自动调用__init__()

class Demo(object):

    # 条件: __new__: 在__init__触发前,自动触发。
def __new__(cls,*args,**kwargs):
print('此处是__new__方法的执行')
#python内部通过object调用的__new__实现产生一个空的对象 --->内存地址
return object.__new__(cls,*args,**kwargs) #条件:__init__在调用类时自动触发
def __init__(self):
print('此处是__init__方法的执行') Demo()

1.2__getattr__

	__getattr__: 在通过 “对象.属性” 获取属性时,若 “属性没有” 时触发。

class Demo(object):
# x =10 def __getattr__(self,item):
print('此处是__getattr__方法的执行')
print(item)
#return 想要返回的值
return 123
obj1 = Demo()
print(obj1.x) #执行结果:
此处是__getattr__方法的执行
x
123

1.3__getattribute__


条件: __getattribute__: 在通过 “对象.属性” 获取属性时,无论 "属性有没有" 都会触发执行。 class Demo:
#x=10
def __getattr__(self, item):
print('此处是__getattr__方法的执行') def __getattribute__(self, item):
print('此处是__getattribute__方法的执行')
# 注意: 此处不能通过对象.属性,否则会产生递归调用,程序崩溃
# return self.__dict__[item]
print(item, '<-----打印属性名字')
# raise AttributeError('抛出异常了')
obj1 = Demo()
obj1.x # 注意: 只要__getattr__ 与 __getattribute__ 同时存在类的内部,只会触发__getattribute__。
#若 执行到__getattribute__ 发现raise AttributeError('抛出异常了'),则再触发__getattr__

1.4__setattr__与__delattr__

条件: __setattr__当 “对象.属性 = 属性值” , 添加或修改属性时触发执行。
条件:__delattr__当删除 “对象.属性” 属性的时候会触发执行。 class Demo:
def __setattr__(self, key, value): # key---> 对象.属性名 value ---》 属性值
print('此处是__setattr__方法的执行')
print(key, value)
# 出现递归
# self.key = value
# 此处是对 对象的名称空间 ---》 字典进行操作
self.__dict__[key] = value
obj1 = Demo()
obj1.x =10
# 原来设置属性时,会自动触发父类中的__setattr__,内部为对象添加x属性,值为20
print(obj1.__dict__) #执行结果:
此处是__setattr__方法的执行
x 10
{'x': 10} class Demo:
x = 1
def __init__(self,y):
self.y = y def __delattr__(self, item):
print('此处是__delattr__方法的执行') obj1 = Demo(10)
del obj1.y
del obj1.x #执行结果:
此处是__delattr__方法的执行
此处是__delattr__方法的执行

1.5__str__

引子:想一想下列情况为什么不一样?

l =list('hello')  #l是list类的实例化出来的一个实例,即一个对象
print(l) #['h','e','l','l','o'] class Foo:
pass
f1 = Foo()
print(f1) #<__main__.Foo object at 0x0000022735920688>

以上所知,所以python内部肯定有内化机制进行过处理,其实质原理如下

条件: __str__在打印对象时触发。

注意: 该方法必须要有一个 “字符串” 返回值。

class Demo:
def __str__(self):
print('此处是__str__方法的执行')
return '自定制的对象的显示方式' obj1 =Demo()
print(obj1) #执行结果:
此处是__str__方法的执行
自定制的对象的显示方式

1.6__getitem__和__setitem__和__delitem__

条件:__getitem__在对象通过 “对象[key]” 获取属性时触发。

class Demo:
def __init__(self,name):
self.name=name
def __getitem__(self, item):
print('此处是__getitem__方法的执行')
print(item)
return self.__dict__[item] obj1 = Demo('lili')
print(obj1, '<----- 打印的对象')
print(obj1['name'])
条件:__setitem__在对象通过 “对象[key]=value值” 设置属性时触发。

class Demo:
def __setitem__(self, key, value):
print('此处是__setitem__方法的执行')
self.__dict__[key] = value obj1 = Demo()
print(obj1.__dict__)
obj1['name'] = 'baohan'
print(obj1.__dict__) #执行结果:
{}
此处是__setitem__方法的执行
{'name': 'baohan'}
条件:__delitem__在对象通过 del “对象[key]” 属性时触发。
class Demo:
def __setitem__(self, key, value):
print('此处是__setitem__方法的执行')
self.__dict__[key] = value def __delitem__(self, key):
print('此处是__delitem__方法的执行')
self.__dict__.pop(key) obj1 = Demo()
print(obj1.__dict__)
obj1['name'] = 'baohan'
print(obj1.__dict__)
#del obj1.name
del obj1['name']
print(obj1.__dict__) #执行结果:
{}
此处是__setitem__方法的执行
{'name': 'baohan'}
此处是__delitem__方法的执行
{}

1.7__call__

条件: __call__在调用对象 “对象 + ()” 时触发。

class Demo:
def __call__(self, *args, **kwargs):
print('此处是__call__方法的执行')
# 调用对象时返回的值
return [1,2,3,4]
obj1 =Demo()
obj1()

Python 类的常用内置方法的更多相关文章

  1. python字符串常用内置方法

    python字符串常用内置方法 定义: 字符串是一个有序的字符的集合,用与存储和表示基本的文本信息. python中引号中间包含的就是字符串. # s1='hello world' # s2=&quo ...

  2. python迭代器-迭代器取值-for循环-生成器-yield-生成器表达式-常用内置方法-面向过程编程-05

    迭代器 迭代器 迭代: # 更新换代(其实也是重复)的过程,每一次的迭代都必须基于上一次的结果(上一次与这一次之间必须是有关系的) 迭代器: # 迭代取值的工具 为什么用迭代器: # 迭代器提供了一种 ...

  3. python 类(object)的内置函数

    python 类(object)的内置函数 # python 类(object)的内置函数 ### 首先 #### 以__双下划线开头的内置函数 __ #### __往往会在某些时候被自动调用,例如之 ...

  4. 迭代器,for循环本质,生成器,常用内置方法,面向过程编程

    一.迭代器 1.迭代:更新换代(重复)的过程,每次的迭代都必须基于上一次的结果 迭代器:迭代取值的工具 2.迭代器给你提供了一种不依赖于索引取值的方式 3.可以迭代取值的对象:字符串,列表,元组,字典 ...

  5. python基础之反射内置方法元类

    补充内置函数 isinstance(obj,Foo)   # 判断obj是不是foo的实例 issubclass()      # 判断一个类是不是另一个类的子类 反射 什么是反射? 通过字符串来操作 ...

  6. python类中的内置函数

    __init__():__init__方法在类的一个对象被建立时,马上运行.这个方法可以用来对你的对象做一些你希望的初始化.注意,这个名称的开始和结尾都是双下划线.代码例子: #!/usr/bin/p ...

  7. python面向对象 : 反射和内置方法

    一. 反射 1. isinstance()和issubclass() isinstance( 对象名, 类名) : 判断对象所属关系,包括父类  (注:type(对象名) is 类名 : 判断对象所属 ...

  8. 《Python》反射、内置方法(__str__,__repr__)

    一.反射 通过字符串的形式操作对象相关的属性.(使用字符串数据类型的变量名来获取这个变量的值) Python中的一切事物都是对象(都可以使用反射) 反射类中的变量 反射对象中的变量 反射模板中的变量 ...

  9. python中字符串的内置方法

    这里说的是字符串中的内置方法,毕竟字符串是最常用的操作对象. ['__add__', '__class__', '__contains__', '__delattr__', '__doc__', '_ ...

随机推荐

  1. Java练习 SDUT-1230_平方和与立方和

    平方和与立方和 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 给定一段连续的整数,求出他们中所有偶数的平方和以及所有奇 ...

  2. PyTorch代码调试利器: 自动print每行代码的Tensor信息

    本文介绍一个用于 PyTorch 代码的实用工具 TorchSnooper.作者是TorchSnooper的作者,也是PyTorch开发者之一. GitHub 项目地址: https://github ...

  3. oracle函数 nls_charset_id(c1)

    [功能]返回字符集名称参应id值 [参数]c1,字符型 [返回]数值型 sql> select nls_charset_id('zhs16gbk') from dual; nls_charset ...

  4. oracle函数 LENGTH(c1)

    [功能]返回字符串的长度; [说明]多字节符(汉字.全角符等),按1个字符计算 [参数]C1 字符串 [返回]数值型 [示例] SQL> select length('高乾竞'),length( ...

  5. 【Android内存机制分析】了解Android堆和栈

    昨天用Gallery做了一个图片浏览选择开机画面的功能,当我加载的图片多了就出现OOM问题.以前也出现过这个问题,那时候并没有深究.这次打算好好分析一下Android的内存机制. 因为我以前是做VC+ ...

  6. 15个非常重要的Apache开源项目汇总

    15个非常重要的Apache开源项目汇总 自1999年创立以来,Apache软件基金会如今已成了众多重要的开源软件项目之家.本文列举了15个多年来非常重要的Apache项目,这些项目不仅对开源运动来说 ...

  7. 微信接口开发报错invalid credential, access_token is invalid or not latest hint

    微信接口凭证access_token一定要全局管理 我们的查酒后台集成了微信公众平台的客服API接口,不用登录微信公众号的后台就可以直接给用户发送消息.最近,运营的同事反馈,通过微信查酒,后台无法直接 ...

  8. Java Annotation详解(二): 反射和Annotation

    前面一篇文<Java Annotation详解(一): 理解和使用Annotation>中,我们或许会觉得,Annotation注释其实并没有多大的作用,除了几个内建的Annotation ...

  9. python起个简单web服务器

    在 Linux 服务器上或安装了 Python 的机器上,Python自带了一个WEB服务器 SimpleHTTPServer. 我们可以很简单的使用  python -m SimpleHTTPSer ...

  10. 51nod 1380"夹克老爷的逢三抽一"(贪心+set)

    传送门 •参考资料 [1]:51Nod-1380-夹克老爷的逢三抽一 •题意 从长度为 n 的数组中抽取 $\frac{n}{3}$ 个不相邻的值使得加和最大(首尾也不能同时取) •题解 贪心选择当前 ...