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安装. 这是最 ...
随机推荐
- Navicat使用教程:获取MySQL中的行数(第1部分)
下载Navicat Premium最新版本 Navicat Premium是一个可连接多种数据库的管理工具,它可以让你以单一程序同时连接到MySQL.Oracle及PostgreSQL数据库,让管理不 ...
- 【BZOJ3293】分金币(贪心)
[BZOJ3293]分金币(贪心) 题面 BZOJ 洛谷 题解 和上一题一样啊. #include<cstdio> #include<cmath> #include<al ...
- 【bzoj4031】[HEOI2015]小Z的房间 解题报告
[bzoj4031][HEOI2015]小Z的房间 Description 你突然有了一个大房子,房子里面有一些房间.事实上,你的房子可以看做是一个包含\(n*m\)个格子的格状矩形,每个格子是一个房 ...
- 【bzoj4016】 FJOI2014—最短路径树问题
http://www.lydsy.com/JudgeOnline/problem.php?id=4016 (题目链接) 题意 给出一张无向图,求出它的最小路径树,然后求最小路径树上节点数为${K}$的 ...
- 响应式开发(三)-----Bootstrap框架的安装使用
下载 Bootstrap 可以从http://getbootstrap.com/上下载 Bootstrap 的最新版本. Download Bootstrap:下载 Bootstrap.点击该按钮,您 ...
- Android获取程序路径 (/data/data/appname)
Android获取文件夹路径 /data/data/ http://www.2cto.com/kf/201301/186614.html String printTxtPath = getApplic ...
- IDA error of " positive sp value has been found"
问:用IDA静态分析,函数结尾出现 endp ; sp-analysis failed 用F5调不出伪代码,不知道是什么原因,请问有什么解决办法没有? 答:endp ; sp-analysis fai ...
- easyUI datetimebox 自定义显示格式
http://blog.csdn.net/littlewolf766/article/details/7329123 项目里需要显示自定义显示格式,比如只显示yyy,yyyy-mm,yyyy-mm-d ...
- 数据融合(data fusion)原理与方法
数据融合(data fusion)原理与方法 数据融合(data fusion)最早被应用于军事领域. 现在数据融合的主要应用领域有:多源影像复合.机器人和智能仪器系统.战场和无人驾驶飞机.图 ...
- idea中复制module和module中的蓝色tag出现的方法
1.在从github上面导入项目到idea中时,经常好多module都是没有蓝色的tag的,这说明这不是个maven形式的module,需要导入到项目中. 举个例子: 有蓝色tag的module才可以 ...