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遍历数组的方法小结
Apr 30 Python
12步入门Python中的decorator装饰器使用方法
Jun 20 Python
Python遍历文件夹和读写文件的实现方法
May 10 Python
python Celery定时任务的示例
Mar 13 Python
Python2和Python3.6环境解决共存问题
Nov 09 Python
Django实现一对多表模型的跨表查询方法
Dec 18 Python
利用Django提供的ModelForm增删改数据的方法
Jan 06 Python
Python os.access()用法实例
Feb 18 Python
关于python 跨域处理方式详解
Mar 28 Python
序列化Python对象的方法
Aug 01 Python
Python使用socket_TCP实现小文件下载功能
Oct 09 Python
python实现录制全屏和选择区域录屏功能
Feb 05 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
让codeigniter与swfupload整合的最佳解决方案
2014/06/12 PHP
destoon二次开发模板及调用语法汇总
2014/06/21 PHP
PHP实现动态添加XML中数据的方法
2018/03/30 PHP
PHP删除字符串中非字母数字字符方法总结
2019/01/20 PHP
jquery 仿QQ校友的DIV模拟窗口效果源码
2010/03/24 Javascript
JS getStyle获取最终样式函数代码
2010/04/01 Javascript
js 判断计算字符串长度/判断空的简单方法
2013/08/05 Javascript
绑定回车enter事件代码
2014/05/18 Javascript
js变量、作用域及内存详解
2014/09/23 Javascript
JavaScript字符串对象的concat方法实例(用于连接两个或多个字符串)
2014/10/16 Javascript
JQuery ZTree使用方法详解
2017/01/07 Javascript
jquery mobile移动端幻灯片滑动切换效果
2020/04/15 Javascript
利用jQuery实现一个简单的表格上下翻页效果
2017/03/14 Javascript
详解webpack 多入口配置
2017/06/16 Javascript
Angular项目如何升级至Angular6步骤全纪录
2018/09/03 Javascript
原生JS实现DOM加载完成马上执行JS代码的方法
2018/09/07 Javascript
JS实现纸牌发牌动画
2021/01/19 Javascript
[02:21]DOTA2英雄基础教程 蝙蝠骑士
2013/12/16 DOTA
python基础教程之基本内置数据类型介绍
2014/02/20 Python
python入门:这篇文章带你直接学会python
2018/09/14 Python
Python发起请求提示UnicodeEncodeError错误代码解决方法
2020/04/21 Python
python能开发游戏吗
2020/06/11 Python
python如何提升爬虫效率
2020/09/27 Python
Alba Moda德国网上商店:意大利时尚女装销售
2016/11/14 全球购物
英国派对礼服和连衣裙购物网站:TFNC London
2018/07/07 全球购物
什么是典型的软件三层结构?软件设计为什么要分层?软件分层有什么好处?
2012/03/14 面试题
初中政治教学反思
2014/01/17 职场文书
六一儿童节主持词
2014/03/21 职场文书
银行贷款承诺书
2014/03/29 职场文书
党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
新郎婚礼答谢词
2015/01/04 职场文书
幼儿园工作总结2015
2015/04/01 职场文书
义诊活动通知
2015/04/24 职场文书
深度好文:50条没人告诉你的人生经验,句句精辟
2019/08/22 职场文书
《暗黑破坏神2:重制版》本周进行第一轮A测 目前可官网进行申请报名
2021/04/07 其他游戏
MySQL数据库索引的最左匹配原则
2021/11/20 MySQL