python进阶之类常用魔法方法和魔法属性
前言
前面我们总结过了python的关键字、运算符、内置函数、语法糖等与python魔法方法之间的关系,现在我们更细一点,看看python的面向对象编程有哪些常用的魔法属性和魔法方法。
魔法属性
对于一个类,python定义了许多可用的魔法属性,有些每个类都默认存在,有些需要用户手动定义。
__dict__
__dict__属性可以说是一个类最常用的属性之一了,它又分为类的__dict__属性和实例的__dict__属性。
class Person(object):
eye = 2
hand = 2
def __init__(self, name):
self.name = name
def run(self):
print('run')
@classmethod
def eat(cls):
print('eat')
if __name__ == "__main__":
person = Person('cai')
print(Person.__dict__)
print(person.__dict__)
类的__dict__属性存储了类定义的所有类属性、类方法等组成的键值对,但不包括继承而来的属性和方法
实例的__dict__属性存储了所有的实例属性的键值对,如果没有就为空;__init__方法其实就是对__dict__属性的初始化赋值;
__doc__
该属性记录了类的说明文档,用类和实例引用指向的都是类的__doc__属性,如果没有默认为None。
class Person(object):
"""person"""
pass
per = Person()
print(per.__doc__) # person
__module__
该属性记录类定义的位置,如果定义的位置正好是主程序,那么该值为"_main_",否则是类属于的模块的名字;
class Person(object):
"""person"""
pass
per = Person()
print(per.__module__) # __main__
__class__
该属性指向该实例的类,即实例指向类对象,类对象指向元类;
class Person(object):
"""person"""
pass
per = Person()
print(per.__class__) # <class '__main__.Person'>
print(per.__class__()) # 创建了一个新的实例
print(Person.__class__) # <class 'type'>
# 在一个类的内部直接使用__class__指代类本身。
__slots__
该属性起到限制动态绑定属性和方法的作用,该属性是一个元组,默认是不存在的,需要手动定义并且只对当前的类起作用,只有添加到元组中的名字才能被动态添加属性,否则报错!
class Person(object):
__slots__ = ('name','age','run')
def __init__(self):
self.height = 100 # 报错
def run(self):
print('run')
if __name__ == "__main__":
from types import MethodType
person = Person()
person.name = 'cai'
person.run = MethodType(run,person)
person.run()
__slots__属性定义好后,限制了一个类的实例的属性以及可以动态添加的属性和方法;
__slots__属性定义好后,不得在类中定义元组中已有的同名的方法;
魔法方法
__new__
该方法是类创建实例调用的第一个方法,返回一个实例;这是一个实例从无到有必须调用的方法,在单例模式中常用,其他不常用。
class Person(object):
def __new__(cls, *args, **kwargs):
print(args)
return object.__new__(cls)
if __name__ == "__main__":
person = Person('cai')
创建实例时会将参数传入new方法,但new方法中无法更改参数。
__init__
该方法可以说是类最常用的方法了,python在调用new方法后会紧接着调用init方法,我们将实例的一些初始化操作放在该方法中,即对__dict__属性进行操作;
class Person(object):
def __init__(self, name):
self.name = name
def __setattr__(self, key, value):
print(key,value)
super().__setattr__(key,value)
if __name__ == "__main__":
person = Person('cai')
print(person.__dict__) # {'name': 'cai'}
所有的“self.name = name”这种语法糖,python会先调用setattr魔法方法,该魔法方法对__dict__属性中添加键值对;
self一定是__new__方法的返回值,如果返回的是1,那么self就是1.
__del__
该方法在实例对象引用计数变为0或del关键字调用的时候触发执行。
__repr__
该方法在print()调用或repr()调用时执行,用来定义对类的信息的描述,每个类都应该定义这个方法。
总结
类的常用魔法属性有__dict__,__doc__,__mould__,__slots__,其中slots属性需要自定义,其他属性默认存在;
构造类常用init,new,del方法,它们在类创造、初始化、销毁时触发;
参考
python进阶之类常用魔法方法和魔法属性的更多相关文章
- python进阶06 常用问题库(2)datetime模块 base64
python进阶06 常用问题库(2)datetime模块 base64 一.datetime模块(时间) 1.datetime.time() t=datetime.time(20,43,30,1) ...
- Python进阶学习之特殊方法实例详析
Python进阶学习之特殊方法实例详析 最近在学习python,学习到了一个之前没接触过的--特殊方法. 什么是特殊方法?当我们在设计一个类的时候,python中有一个用于初始化的方法$__init_ ...
- python_魔法方法(四):属性访问
通常可以通过点(.)操作符的形式去访问对象的属性,也可以通过BIF适当地去访问属性,看个例子吧 >>> class A(): def __init__(self): self.x = ...
- python进阶05 常用问题库(1)json os os.path模块
python进阶05 常用问题库(1)json os os.path模块 一.json模块(数据交互) web开发和爬虫开发都离不开数据交互,web开发是做网站后台的,要跟网站前端进行数据交互 1.什 ...
- Python进阶----反射(四个方法),函数vs方法(模块types 与 instance()方法校验 ),双下方法的研究
Python进阶----反射(四个方法),函数vs方法(模块types 与 instance()方法校验 ),双下方法的研究 一丶反射 什么是反射: 反射的概念是由Smith在1982年首次提出的 ...
- python进阶之关键字和运算符触发魔法方法
前言 python有众多的魔法方法,它们会在满足某种条件下触发执行,掌握好魔法方法的使用,可以加快程序的运行效率,同时减少逻辑调用. 关键字与魔法方法 python的一些魔法方法是关键字触发的,即py ...
- Python学习之==>常用字符串方法
1.常用字符串方法 a = '\n 字 符 串 \n\n' b = a.strip() # 默认去掉字符串两边的空格和换行符 c = a.lstrip() # 默认去掉字符串左边的空格和换行符 d = ...
- Python学习day07 - Python进阶(1) 内置方法
figure:last-child { margin-bottom: 0.5rem; } #write ol, #write ul { position: relative; } img { max- ...
- Windows下python库的常用安装方法
目录: 1.pip安装(需要pip) 2.通过下载whl文件安装(需要pip) 3.在pythn官网下载安装包安装(不需要pip) 方法一:pip安装. 这是最 ...
随机推荐
- Qt4问题集锦
一.Qt程序发布后加载的jpg.jpeg图片不可见 问题的提出: 最近在客户机器上部署安装QT编写的软件,发现只要是jpg.jpeg格式的图片都无法显示出来.最后发现必须按如下述步骤才能显示jpg.j ...
- BZOJ1064 NOI2008假面舞会(dfs树)
将图中的环的长度定义为正向边数量-反向边数量,那么答案一定是所有环的环长的共同因子.dfs一下就能找到图中的一些环,并且图中的所有环的环长都可以由这些环长加加减减得到(好像不太会证).如果有环长为1或 ...
- MT【153】缩小包围圈
(清华2017.4.29标准学术能力测试3) 集合$S=\{1,2,\cdots,25\}$,$A\subseteq S$,且$A$ 的所有子集中元素之和不同.则下列选项正确的有( ) A. ...
- 【BZOJ3293】分金币(贪心)
[BZOJ3293]分金币(贪心) 题面 BZOJ 洛谷 题解 和上一题一样啊. #include<cstdio> #include<cmath> #include<al ...
- 【Learning】常系数线性齐次递推
给定数列前k项\(h_0...h_{k-1}\),其后的项满足:\(h_i=\sum_{i=1}^kh_{i-j}a_i\),其中\(a_1...a_k\)是给定的系数,求\(h_n\) 数据范围小的 ...
- 前端学习 -- Xhtml语法规范
Xhtml语法规范 HTML中不区分大小写,但是尽量使用小写: HTML的注释不能嵌套: 标签必须结构完整{要么成对出现,要么自结束标签,虽然浏览器会帮我们修正一些不符合规范的内容} 标签可以嵌套但是 ...
- Android Studio 使用VCS版本控制
1.SVN的配置: 如果项目使用的是SVN配置,那么除了乌龟SVN GUI工具外,你还得下载Subversion, 因为AS要用其中的xx.exe命令行执行程序, 下载地址:https://www.v ...
- shell 循环语句
1.while 2.for 3.until 4.select while #!/bin/bash # 显示一系列数字 count=1 while [ $count -le 6 ]; do echo $ ...
- UnityShader 序列帧动画效果
实现原理:主要思想是设置显示uv纹理的大小,并逐帧修改图片的uv坐标. 实现步骤 1.我们首先用_Time.y和速度属性_Speed相乘得到模拟的时间. 2.然后我们用time除以_Horizonta ...
- Lvs+Keepalived实现MySQL高可用
LVS+Keepalived+MySQL高可用配置 本文所有配置前提是已实现MySQL双主备份(MySQL双主) 安装前的准备: VIP:192.168.0.201 Keepalived: Keepa ...