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实现排序算法
Feb 14 Python
收集的几个Python小技巧分享
Nov 22 Python
详解python之配置日志的几种方式
May 22 Python
Python中使用pypdf2合并、分割、加密pdf文件的代码详解
May 21 Python
Python实现朴素贝叶斯的学习与分类过程解析
Aug 24 Python
完美解决TensorFlow和Keras大数据量内存溢出的问题
Jul 03 Python
浅谈如何使用python抓取网页中的动态数据实现
Aug 17 Python
详解python tkinter包获取本地绝对路径(以获取图片并展示)
Sep 04 Python
通俗易懂了解Python装饰器原理
Sep 17 Python
python 装饰器的基本使用
Jan 13 Python
详解非极大值抑制算法之Python实现
Jun 28 Python
Django基础CBV装饰器和中间件
Mar 22 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中call_user_func_array()函数的用法演示
2012/02/05 PHP
php中异常处理方法小结
2015/01/09 PHP
解析WordPress中的post_class与get_post_class函数
2016/01/04 PHP
php 获取xml接口数据的处理方法
2018/05/31 PHP
nodejs win7下安装方法
2012/05/24 NodeJs
利用js实现在浏览器状态栏显示访问者在本页停留的时间
2013/12/29 Javascript
jQuery源码分析之jQuery中的循环技巧详解
2014/09/06 Javascript
js判断手机和pc端选择不同执行事件的方法
2015/01/30 Javascript
javascript中eval和with用法实例总结
2015/11/30 Javascript
React.js入门实例教程之创建hello world 的5种方式
2016/05/11 Javascript
玩转JavaScript OOP - 类的实现详解
2016/06/08 Javascript
Node.js数据库操作之连接MySQL数据库(一)
2017/03/04 Javascript
jQuery Json数据格式排版高亮插件json-viewer.js使用方法详解
2017/06/12 jQuery
jQuery基于cookie实现换肤功能实例
2017/10/14 jQuery
微信小程序按钮点击动画效果的实现
2019/09/04 Javascript
解决layui追加或者动态修改的表单元素“没效果”的问题
2019/09/18 Javascript
js构造函数constructor和原型prototype原理与用法实例分析
2020/03/02 Javascript
[46:43]DOTA2上海特级锦标赛主赛事日 - 1 胜者组第一轮#2LGD VS MVP.Phx第二局
2016/03/02 DOTA
[01:04:48]VGJ.S vs TNC Supermajor 败者组 BO3 第一场 6.6
2018/06/07 DOTA
python中常用的九种预处理方法分享
2016/09/11 Python
在CentOS6上安装Python2.7的解决方法
2018/01/09 Python
Python使用正则表达式获取网页中所需要的信息
2018/01/29 Python
python调用c++返回带成员指针的类指针实例
2019/12/12 Python
Python3 hashlib密码散列算法原理详解
2020/03/30 Python
如何在django中实现分页功能
2020/04/22 Python
CSS3打造磨砂玻璃背景效果
2016/09/28 HTML / CSS
css和css3弹性盒模型实现元素宽度(高度)自适应
2019/05/15 HTML / CSS
苏格兰销售女装、男装和童装的连锁店:M&Co
2018/03/16 全球购物
意大利在线药房:shop-farmacia.it
2019/03/12 全球购物
Goodee官方商店:迷你投影仪
2021/03/15 全球购物
八年级物理教学反思
2014/01/19 职场文书
军训自我鉴定范文
2014/02/13 职场文书
《富饶的西沙群岛》教学反思
2016/02/16 职场文书
安全生产协议书
2016/03/22 职场文书
一年之计:2019年下半年的计划
2019/05/07 职场文书
iOS 16进一步确认,一共支持16款iPhone
2022/04/28 数码科技