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

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

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 类的内置方法_Python 类的常用内置方法相关推荐

  1. python创建文件对象的函数_Python 文件对象常用内建方法

    学习python教程文件操作时,除了 文件对象读取内容 file.read(size):size为读字节的长度,默认为-1. file.readline(size):逐行读取,如果定义了size参数, ...

  2. python中urframe函数的用法_python类中的内置函数

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

  3. python查看类的属性和方法_python—类的属性和方法总结

    一.类的属性总结(类的属性定义在方法外,对象的属性定义在方法内) 理解: 类的(静态)属性:(人类的五官,理解为变量) 类的(动态)方法:(人类吃穿住行,理解为一个函数,至少带一个参数self,指向类 ...

  4. python类包含对象的个数_python类与对象各个算数运算魔法方法总结

    1.python类与对象各个算术运算魔法方法总结: 2.各个魔法方法应用举例: 3.实例训练: (1)我们都知道在 Python 中,两个字符串相加会自动拼接字符串,但遗憾的是两个字符串相减却抛出异常 ...

  5. python类的继承super方法_Python类的继承super相关原理解析

    看了网上许多关于super.mro.C3的介绍感觉没有一份很容易初学者理解的文档,直接看C3算法的话,比较难理解,也没必要,如果掌握一套规律的话,会轻松许多.我将网上这些博主的文章进行一个梳理总结,最 ...

  6. python类的专有方法_Python——类的专有方法

    Python除了自定义私有变量和方法外,还可以定义专有方法.专有方法是在特殊情况下或使用特殊语法时由python调用的,而不是像普通方法一样在代码中直接调用.看到形如__XXX__的变量或函数名时就需 ...

  7. python中静态变量和静态方法_python类和函数中使用静态变量的方法

    本文实例讲述了python类和函数中使用静态变量的方法.分享给大家供大家参考.具体分析如下: 在python的类和函数(包括λ方法)中使用静态变量似乎是件不可能[Nothing is impossib ...

  8. python用类名直接调用方法_Python类的实例方法、静态方法、类方法详解,附代码示例...

    实例方法 普通实例方法(instance method),第一个参数需要是self,它表示一个具体的实例本身,只能被实例对象调用,通过self引用的可能是类属性.也有可能是实例属性. 实例方法访问类属 ...

  9. python 类继承方法_python类的继承、多继承及其常用魔术方法

    继承 一个类可以派生出一个子类,这个子类可以使用父类的属性及方法,也可以在父类的基础上添加自己的独特属性或方法.属性和方法的继承的顺序是先从自己开始,找不到再去找父类,父类没有再找父类的父类,其尽头就 ...

最新文章

  1. 天勤数据结构:前缀、中缀、后缀表达式的转换与计算
  2. Robust PCA
  3. 树的知识点总结-数据结构
  4. Log4j漏洞?一行代码都不改就能永久修复?
  5. 在mysql怎样查询地址和电话_Mysql数据查询
  6. C语言学习笔记---打印函数printf()和sprintf()函数
  7. 如何使用无线连接来使Android调试手机
  8. XP系统每次打开我的电脑出现自动扫描现象解决办法
  9. python的字符串类型_python如何判断某变量是否为字符串类型
  10. python 教材 配套 试题库_Python语言应用2020满分完整版考 试题库大全
  11. React的this.props.children
  12. 调用服务器直接打印文件,使用 LP 打印命令设置直接连接的打印机
  13. PythonStock(9):使用优矿uqer.io 进行简单的数据分析
  14. 本地音乐如何导入apple_如何将自己的音乐添加到Apple Music
  15. 教您启用iphone 4 使用FaceTime和蜂窝数据网、彩信!设置(不需補丁、不需恢复系统)
  16. 学习笔记42—Win7下安装Linux双系统
  17. 机器学习 梯度到底是什么?
  18. 【数据库】imp-00015
  19. 《FLUENT 14.0超级学习手册》——第1章 流体力学与计算流体力学基础1.1 流体力学基础...
  20. python使用scrapy爬虫总是提示ModuleNotFoundError: No module named ‘‘

热门文章

  1. MyEclipse使用总结——设置MyEclipse使用的Tomcat服务器
  2. MVC UpdateModel的未能更新XXXXX的类型模型
  3. 使用.udl快速测试与数据库的连接并得到连接字符串
  4. 体验XHProf(linux版本)
  5. CentOS crontab定时任务不执行的解决
  6. Vue使用全局样式,页面没有发生变化:逗号是中文的,引起错误,样式不变化 也没有报错就是不起作用
  7. PHP通过URL传递session_id
  8. JQUERY设置或返回属性值attr
  9. python deepcopy函数_用Python解数独[6]:递归获得最终答案
  10. 关于微信授权与登录的相关操作(纯手敲)