Python 类的魔法属性用法实例分析


Posted in Python onNovember 21, 2019

本文实例讲述了Python 类的魔法属性用法。分享给大家供大家参考,具体如下:

魔法属性

无论人或事物往往都有不按套路出牌的情况,Python的类属性也是如此,存在着一些具有特殊含义的属性,详情如下:

1. doc

表示类的描述信息

class Foo:
  """ 描述类信息,这是用于看片的神奇 """
  def func(self):
    pass
print(Foo.__doc__)
#输出:类的描述信息

2. module 和 class

module 表示当前操作的对象在那个模块
class 表示当前操作的对象的类是什么

test.py

# -*- coding:utf-8 -*-

class Person(object):
  def __init__(self):
    self.name = 'laowang'

main.py

from test import Person
obj = Person()
print(obj.__module__) # 输出 test 即:输出模块
print(obj.__class__) # 输出 test.Person 即:输出类

3. init

初始化方法,通过类创建对象时,自动触发执行

class Person:
  def __init__(self, name):
    self.name = name
    self.age = 18
obj = Person('laowang') # 自动执行类中的 __init__ 方法

4. del

当对象在内存中被释放时,自动触发执行。

注:此方法一般无须定义,因为Python是一门高级语言,程序员在使用时无需关心内存的分配和释放,因为此工作都是交给Python解释器来执行,所以,__del__的调用是由解释器在进行垃圾回收时自动触发执行的。

class Foo:
  def __del__(self):
    pass

5. call

对象后面加括号,触发执行。

注:__init__方法的执行是由创建对象触发的,即:对象 = 类名() ;而对于 call 方法的执行是由对象后加括号触发的,即:对象() 或者 类()()

class Foo:
  def __init__(self):
    pass
  def __call__(self, *args, **kwargs):
    print('__call__')
obj = Foo() # 执行 __init__
obj() # 执行 __call__

6. dict

类或对象中的所有属性

类的实例属性属于对象;类中的类属性和方法等属于类,即:

class Province(object):
  country = 'China'
  def __init__(self, name, count):
    self.name = name
    self.count = count
  def func(self, *args, **kwargs):
    print('func')
# 获取类的属性,即:类属性、方法、
print(Province.__dict__)
# 输出:{'__dict__': <attribute '__dict__' of 'Province' objects>, '__module__': '__main__', 'country': 'China', '__doc__': None, '__weakref__': <attribute '__weakref__' of 'Province' objects>, 'func': <function Province.func at 0x101897950>, '__init__': <function Province.__init__ at 0x1018978c8>}
obj1 = Province('山东', 10000)
print(obj1.__dict__)
# 获取 对象obj1 的属性
# 输出:{'count': 10000, 'name': '山东'}
obj2 = Province('山西', 20000)
print(obj2.__dict__)
# 获取 对象obj1 的属性
# 输出:{'count': 20000, 'name': '山西'}

7. str

如果一个类中定义了__str__方法,那么在打印 对象 时,默认输出该方法的返回值。

class Foo:
  def __str__(self):
    return 'laowang'
obj = Foo()
print(obj)
# 输出:laowang

8、getitem、setitem、delitem

用于索引操作,如字典。以上分别表示获取、设置、删除数据

# -*- coding:utf-8 -*-
class Foo(object):
  def __getitem__(self, key):
    print('__getitem__', key)
  def __setitem__(self, key, value):
    print('__setitem__', key, value)
  def __delitem__(self, key):
    print('__delitem__', key)
obj = Foo()
result = obj['k1']   # 自动触发执行 __getitem__
obj['k2'] = 'laowang'  # 自动触发执行 __setitem__
del obj['k1']      # 自动触发执行 __delitem__

9、getslice、setslice、delslice

该三个方法用于分片操作,如:列表

# -*- coding:utf-8 -*-
class Foo(object):
  def __getslice__(self, i, j):
    print('__getslice__', i, j)
  def __setslice__(self, i, j, sequence):
    print('__setslice__', i, j)
  def __delslice__(self, i, j):
    print('__delslice__', i, j)
obj = Foo()
obj[-1:1]          # 自动触发执行 __getslice__
obj[0:1] = [11,22,33,44]  # 自动触发执行 __setslice__
del obj[0:2]        # 自动触发执行 __delslice__

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
Python中if __name__ == '__main__'作用解析
Jun 29 Python
解读python logging模块的使用方法
Apr 17 Python
Python并发之多进程的方法实例代码
Aug 15 Python
对python csv模块配置分隔符和引用符详解
Dec 12 Python
python将一个英文语句以单词为单位逆序排放的方法
Dec 20 Python
PIL对上传到Django的图片进行处理并保存的实例
Aug 07 Python
python matplotlib折线图样式实现过程
Nov 04 Python
Pycharm 安装 idea VIM插件的图文教程详解
Feb 21 Python
使用keras2.0 将Merge层改为函数式
May 23 Python
python获取命令行参数实例方法讲解
Nov 02 Python
python tkinter的消息框模块(messagebox,simpledialog)
Nov 07 Python
pytest实现多进程与多线程运行超好用的插件
Jul 15 Python
python画蝴蝶曲线图的实例
Nov 21 #Python
Python 静态方法和类方法实例分析
Nov 21 #Python
Python 用turtle实现用正方形画圆的例子
Nov 21 #Python
python 实现兔子生兔子示例
Nov 21 #Python
python3实现用turtle模块画一棵随机樱花树
Nov 21 #Python
用python中的matplotlib绘制方程图像代码
Nov 21 #Python
python hash每次调用结果不同的原因
Nov 21 #Python
You might like
日本十大惊悚动漫
2020/03/04 日漫
一个php导出oracle库的php代码
2009/04/20 PHP
PHP根据两点间的经纬度计算距离
2014/10/31 PHP
非集成环境的php运行环境(Apache配置、Mysql)搭建安装图文教程
2016/04/12 PHP
PHP错误提示It is not safe to rely on the system……的解决方法
2019/03/25 PHP
PHP实现腾讯短网址生成api接口实例
2020/12/08 PHP
jquery 指南/入门基础
2007/11/30 Javascript
jquery插件之文字间歇自动向上滚动效果代码
2016/02/25 Javascript
AngularJS控制器继承自另一控制器
2016/05/09 Javascript
jquery实现上传文件大小类型的验证例子(推荐)
2016/06/25 Javascript
Vue实例简单方法介绍
2017/01/20 Javascript
浅谈在Vue-cli里基于axios封装复用请求
2017/11/06 Javascript
Vue中父子组件通讯之todolist组件功能开发
2018/05/21 Javascript
基于iview的router常用控制方式
2019/05/30 Javascript
layui将table转化表单显示的方法(即table.render转为表单展示)
2019/09/24 Javascript
解决vue动态下拉菜单 有数据未反应的问题
2020/08/06 Javascript
JavaScript中遍历的十种方法总结
2020/12/15 Javascript
Python实现基本数据结构中栈的操作示例
2017/12/04 Python
获取python的list中含有重复值的index方法
2018/06/27 Python
tensorflow实现图像的裁剪和填充方法
2018/07/27 Python
对Python3之进程池与回调函数的实例详解
2019/01/22 Python
使用python制作游戏下载进度条的代码(程序说明见注释)
2019/10/24 Python
Python csv文件记录流程代码解析
2020/07/16 Python
浅析HTML5页面元素及属性
2021/01/20 HTML / CSS
英国领先的男装设计师服装购物网站:Mainline Menswear
2018/02/04 全球购物
Bibloo匈牙利:女装、男装、童装及鞋子和配饰
2019/04/14 全球购物
工作中个人的自我评价
2013/12/31 职场文书
高中军训感言500字
2014/02/24 职场文书
办公室员工岗位工作职责
2014/03/10 职场文书
婚前协议书怎么写
2014/04/15 职场文书
《雕塑之美》教学反思
2014/04/24 职场文书
2014办公室年度工作总结
2014/12/09 职场文书
售后服务质量承诺书
2015/04/29 职场文书
2016新年晚会开场白
2015/12/03 职场文书
Python移位密码、仿射变换解密实例代码
2021/06/27 Python
NoSQL优缺点与MongoDB数据库简介
2022/06/05 MongoDB