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正则表达式介绍
Aug 06 Python
让python同时兼容python2和python3的8个技巧分享
Jul 11 Python
结合Python的SimpleHTTPServer源码来解析socket通信
Jun 27 Python
快速了解Python中的装饰器
Jan 11 Python
python的pandas工具包,保存.csv文件时不要表头的实例
Jun 14 Python
Python+selenium 获取浏览器窗口坐标、句柄的方法
Oct 14 Python
Python面向对象程序设计OOP深入分析【构造函数,组合类,工具类等】
Jan 05 Python
详解Python3中setuptools、Pip安装教程
Jun 18 Python
Python3进制之间的转换代码实例
Aug 24 Python
MAC平台基于Python Appium环境搭建过程图解
Aug 13 Python
python openssl模块安装及用法
Dec 06 Python
Pandas中DataFrame交换列顺序的方法实现
Dec 14 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
php实现无限级分类实现代码(递归方法)
2011/01/01 PHP
php设计模式 Composite (组合模式)
2011/06/26 PHP
PHP解析目录路径的3个函数总结
2014/11/18 PHP
php简单实现批量上传图片的方法
2016/05/09 PHP
PHP实现的pdo连接数据库并插入数据功能简单示例
2019/03/30 PHP
jQuery之网页换肤实现代码
2011/04/30 Javascript
分享33个jQuery与CSS3实现的绚丽鼠标悬停效果
2014/12/15 Javascript
jquery实现图片上传之前预览的方法
2015/07/11 Javascript
详解Jquery 遍历数组之$().each方法与$.each()方法介绍
2017/01/09 Javascript
js数字舍入误差以及解决方法(必看篇)
2017/02/28 Javascript
vue上传图片组件编写代码
2017/07/26 Javascript
关于redux-saga中take使用方法详解
2018/02/27 Javascript
Layui数据表格判断编辑输入的值,是否为我需要的类型详解
2019/10/26 Javascript
vue点击标签切换选中及互相排斥操作
2020/07/17 Javascript
[01:01:36]Optic vs paiN 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
用pywin32实现windows模拟鼠标及键盘动作
2014/04/22 Python
彻底理解Python list切片原理
2017/10/27 Python
Python冲顶大会 快来答题!
2018/01/17 Python
Django中使用第三方登录的示例代码
2018/08/20 Python
python实现机器学习之元线性回归
2018/09/06 Python
python2与python3中关于对NaN类型数据的判断和转换方法
2018/10/30 Python
Python3.6中Twisted模块安装的问题与解决
2019/04/15 Python
tensorflow2.0与tensorflow1.0的性能区别介绍
2020/02/07 Python
tensorflow 获取checkpoint中的变量列表实例
2020/02/11 Python
使用python创建Excel工作簿及工作表过程图解
2020/05/27 Python
CSS3动画特效在活动页中的应用
2020/01/21 HTML / CSS
Canvas引入跨域的图片导致toDataURL()报错的问题的解决
2018/09/19 HTML / CSS
JRE、JDK、JVM之间的关系怎样
2012/05/16 面试题
高中毕业自我鉴定范文
2013/10/02 职场文书
工程质检员岗位职责
2015/04/08 职场文书
婚庆司仪开场白
2015/05/29 职场文书
《抽屉原理》教学反思
2016/02/20 职场文书
2019年大学生暑期社会实践调查报告模板
2019/11/07 职场文书
Nginx URL重写rewrite机制原理及使用实例
2021/04/01 Servers
MySQL Router实现MySQL的读写分离的方法
2021/05/27 MySQL
制作能在nginx和IIS中使用的ssl证书
2021/06/21 Servers