python类特列方法使用
class Rgc(object):def __new__(cls, *args, **kwargs):print('在类通过__new__方法实例化一个对象')return super(Rgc, cls).__new__(cls)def __init__(self, name, gender):"""Usage:>>> Rgc('rg','man'):param name::param gender:"""print('在类通过__new__方法实例化为一个对象后,此方法是对这个对象 参数的初始化(先执行__new__,再执行__init)')self.name = nameself.gender = genderdef __call__(self, age):"""把类实例化对象当做一个方法调用;Usage:>>> rg_obj=Rgc('rg','man')>>> rg_obj(14)>>> 14>>> Rgc('rg','man')(14)>>> 14:param age::return:"""print("""把类实例化对象当做一个方法调用;""")return agedef __str__(self):return '用户输出的数据,通过print方法显示的内容'def __repr__(self):return "控制台输出的内容,只有在控制台时才会显示"def __enter__(self):"""__enter__方法配合__exit__方法使用,主要用来 以 with xxxx as xxx: 的方式(比如访问文件)调用__enter__ 必须有 return ,并且return 的结果作为as后面的变量使用。Usage:>>> with Rgc('rg','girl') as rg_obj:>>> print(rg_obj.name):return: obj"""print('进入with')return selfdef __exit__(self, exc_type, exc_val, exc_tb):"""__exit__函数 是 在 with xxxx as xxx: 的语句结束时需要处理的相关数据,如释放链接,清除内存等:param exc_type::param exc_val::param exc_tb::return:"""print('退出with')class St():mana_list = []mana_dict = {}def __init__(self, num):self.names = numself.mana_list.append(num)self.mana_dict[num] = selfdef __getitem__(self, item):"""此方法可以把对象模拟成list或dict 的方式调用,即 key-val 类型但是此方法 需要用到 类属性,类多次实例化时,类属性的值共享,所以 需要注意 使用情况使用事例 如下方 代码:param item::return:"""if isinstance(item, str):return self.mana_dict[item]else:return self.mana_list[item]fir = St('first') sec = St('secound') thi = St('third') print(thi.mana_list, '分割',thi.mana_dict) # ['first', 'secound', 'third'],'分割', {'first': <__main__.St object at 0x000001C6DF19AA58>, 'secound': <__main__.St object at 0x000001C6DF19AA90>, 'third': <__main__.St object at 0x000001C6DF19AAC8>}print(thi[1], thi['third'].names) # secound thirdprint(fir.__dict__) # {'names': 'first'} 总结:实例化对象的__dict__存了实例化属性,即 self.xxx=yyy print(St.__dict__) # {'__module__': '__main__', 'mana_list': ['first', 'secound', 'third'], 'mana_dict': {'first': <__main__.St object at 0x00000231144BAA90>, 'secound': <__main__.St object at 0x00000231144BAAC8>, 'third': <__main__.St object at 0x00000231144BAB00>}, '__init__': <function St.__init__ at 0x00000231144CF1E0>, '__getitem__': <function St.__getitem__ at 0x00000231144CF268>, '__dict__': <attribute '__dict__' of 'St' objects>, '__weakref__': <attribute '__weakref__' of 'St' objects>, '__doc__': None} # 总结:类的__dict__存了全局变量,静态函数,类函数,普通函数,内置属性print(fir.__dir__()) # ['names', '__module__', 'mana_list', 'mana_dict', '__init__', '__getitem__', '__dict__', '__weakref__', '__doc__', '__repr__', '__hash__', '__str__', '__getattribute__', '__setattr__', '__delattr__', '__lt__', '__le__', '__eq__', '__ne__', '__gt__', '__ge__', '__new__', '__reduce_ex__', '__reduce__', '__subclasshook__', '__init_subclass__', '__format__', '__sizeof__', '__dir__', '__class__'] # 总结:实例化的 __dir__() 存了 全局变量,静态函数,类函数,普通函数,内置属性 的名字 列表print(thi.__class__.mana_list) # 获取实例化 属性值 print(thi.__class__.__name__) # 获取 实例化 类 的 名字 字符串 值print('*' * 20)class AttTest():nu = 1a = 4def __init__(self, nu):self.nu = nudef __getattr__(self, item):"""属性查找顺序为:实例的__getattribute__-->实例对象字典-->实例所在类字典-->实例所在类的父类(MRO顺序)字典-->实例所在类的__getattr__-->报错:param item::return:"""print('在访问未定义的属性时,调用此方法,如果不显示的引用此方法 则程序直接报错;此方法在属性访问顺序的末端')return '不存在此属性'te = AttTest(20) print(te.nu, AttTest.nu) print(getattr(te, 'nu'), 'getattr 实例化') # getattr() 方法访问实例的属性 结果为 20 print(getattr(AttTest, 'nu'), 'getattr obj') # getattr() 方法访问类属性 结果为 1 print(te.a1)print('*' * 20)class AttTestOne:nu = 1a = 4def __init__(self, nu):self.nu = nudef __getattribute__(self, item):"""此方法 叫 属性访问拦截器,此拦截器是 属性访问顺序中 优先级最高的,会先执行此方法的代码;属性查找顺序为:实例的__getattribute__-->实例对象字典-->实例所在类字典-->实例所在类的父类(MRO顺序)字典-->实例所在类的__getattr__-->报错waring: 注意此方法 如果 return self.item 会造成 死循环:param item::return:"""print('start getattribute func')if item == 'nu':return Truereturn Falsete_one = AttTestOne(22) print(te_one.nu)print('*' * 20)class SetattTest(object):private = ['age']def __init__(self, job):self.job = jobdef __setattr__(self, key, value):"""此__setattr__ 在对实例 赋值,或者在__init__中初始化参数时,调用此方法,注意 此方法里面 不要使用 self.key=value ,因为会无限 调用 __setattr__方法 导致报错。此方法 在设置属性时使用 self.__dict__[key] = value其他功能 比如 可以强制设置类的private方法:param key::param value::return:"""print('start {},{}'.format(key, value))# self.key=valueif key in self.private:raise AttributeError('this attribute can not be changed!')else:self.__dict__[key] = value# self.key=value # 对属性赋值不要用此方法,会无限循环最终报错 aa = SetattTest('work') aa.name = 'a' # aa.age = 'b' print(aa.__dict__)__all__ = ['SetattTest', 'AttTestOne'] """ __all__方法 里面是 函数或 常量 或 类 的名字,一般在 __init__.py 文件中使用,在其他地方 通过 from df import * 时,只会导入 __all__里的方法 """
python类特列方法使用相关推荐
- python类的析构方法是什么_python类的析构方法是什么_python类析构
python __del__ 转自:http://blog.csdn.net/bbdxf/article/details/25774763 最近学习<Python参考手册>学到Class部 ...
- python类继承中构造方法_第8.3节 Python类的__init__方法深入剖析:构造方法与继承详解...
第8.3节Python类的__init__方法深入剖析:构造方法与继承详解 一. 引言 上两节介绍了构造方法的语法及参数,说明了构造方法是Python的类创建实例后首先执行的方法,并说明如果类没 ...
- python方法定义..._解析Python类中的方法定义
最近在学习类过程中,绑定方法这个概念没有理解透彻,所以在网上找了很多相关博客.文章研究到底是怎么一回事.因为有的文章所陈述与我在python3.5版本实际实验中有些出入,所以经过实践后总结出以下结论. ...
- python 类的绑定方法和非绑定方法
一.绑定方法 1.对象的绑定方法 首先我们明确一个知识点,凡是类中的方法或函数,默认情况下都是绑定给对象使用的.下面,我们通过实例,来慢慢解析绑定方法的应用. class People:def __i ...
- python 类 对象 魔法方法概念+习题
类 对象 类 对象是c++和java中都有的内容,python定义类的简单语法如下: class 类名: -类变量或者方法 Python 的类定义有点像函数定义,都是以冒号:作为类体的开始,以统一缩进 ...
- 全面解析python类的绑定方法与非绑定方法(转载+自己的消化与理解)
参考链接来自: https://www.cnblogs.com/vipchenwei/p/7126772.html#_label1 先说下,这篇文章中,其实有这么个事情: 也就是,该文章有的函数后面没 ...
- python 析构函数_常用的python类的魔术方法
对于很少使用python编写大型代码的朋友可能会忘记python还是一种面向对象的语言.在其他面向对象的语言中有构造函数.析构函数等等在生命周期不同时机自动调用的函数,python当然也是有的.除此之 ...
- python类的特殊方法汇总_Python笔记001-类的特殊方法
Python笔记001-类的特殊方法 以下是我学习<流畅的Python>后的个人笔记,现在拿出来和大家共享,希望能帮到各位Python学习者. 首次发表于: 微信公众号:科技老丁哥,ID: ...
- Python类中公开方法、私有方法和特殊方法的继承原理
在Python中,对象的私有成员在类外部.派生类或程序中无法直接访问,但是可以通过"对象名._类名__私有成员名"这样一种特殊的形式来访问. 基类的构造方法和公开方法可以在类的外部 ...
最新文章
- 泰晤士报华科计算机排名,国内大学排行被“高估”的三所985大学,实力远小于排名,你认可吗?...
- MaxCompute大数据实践,电商数据仓库选择雪花还是星型模型?
- Self-training在目标检测任务上的实践
- 如何迅速掌握并提高linux运维技能
- CentOS7的初始配置
- Mongodb索引及explain
- python需要cpu还是显卡问题_买新电脑是cpu重要还是显卡重要?该怎么选择?
- python开发数据管理系统客户桌面_实践是最好的老师:给中级 Python 开发人员的 13 个项目构想...
- 从零写一个操作系统之booting
- 牛客网数据开发题库_牛客网刷题笔记--数据库
- dubbo之使用nacos作为注册中心
- 给定一个 32 位有符号整数,将整数中的数字进行反转。
- Liunx配置yum源与本地配置yum源
- Eclipse安装过程
- vue中使用接口(搜狐接口)获取访客IP地址
- 基于android的通讯录,基于Android的通讯录管理系统.doc
- Planet-在Word里添加格式美丽的代码
- 20 Rest高级客户端实践(六):搜索入门和基本API介绍
- 3D视觉:为工业机器人配备一双“火眼金睛”
- html文件必须由特定的程序进行编译和执行才能显示,这种编译器就是,计算机基础知识题库...
热门文章
- 整理:用matlab创作歌曲(一)
- net::ERR_CONTENT_LENGTH_MISMATCH 206 (Partial Content) 报错
- 面向对象设计原则:开闭原则(OCP)
- 树莓派zero+mysql_树莓派zero初步调试
- Error: Flash Download failed - “Cortex-M3“错误解决办法
- 【分享】如何测试微信小程序!
- Linux下automake应用
- SQL*Plus 系统变量之55 - TIMI[NG]
- 宽表和窄表概念和优缺点
- 微信怎么使用手机号码收款转账?