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类特列方法使用相关推荐

  1. python类的析构方法是什么_python类的析构方法是什么_python类析构

    python __del__ 转自:http://blog.csdn.net/bbdxf/article/details/25774763 最近学习<Python参考手册>学到Class部 ...

  2. python类继承中构造方法_第8.3节 Python类的__init__方法深入剖析:构造方法与继承详解...

    第8.3节Python类的__init__方法深入剖析:构造方法与继承详解 一.    引言 上两节介绍了构造方法的语法及参数,说明了构造方法是Python的类创建实例后首先执行的方法,并说明如果类没 ...

  3. python方法定义..._解析Python类中的方法定义

    最近在学习类过程中,绑定方法这个概念没有理解透彻,所以在网上找了很多相关博客.文章研究到底是怎么一回事.因为有的文章所陈述与我在python3.5版本实际实验中有些出入,所以经过实践后总结出以下结论. ...

  4. python 类的绑定方法和非绑定方法

    一.绑定方法 1.对象的绑定方法 首先我们明确一个知识点,凡是类中的方法或函数,默认情况下都是绑定给对象使用的.下面,我们通过实例,来慢慢解析绑定方法的应用. class People:def __i ...

  5. python 类 对象 魔法方法概念+习题

    类 对象 类 对象是c++和java中都有的内容,python定义类的简单语法如下: class 类名: -类变量或者方法 Python 的类定义有点像函数定义,都是以冒号:作为类体的开始,以统一缩进 ...

  6. 全面解析python类的绑定方法与非绑定方法(转载+自己的消化与理解)

    参考链接来自: https://www.cnblogs.com/vipchenwei/p/7126772.html#_label1 先说下,这篇文章中,其实有这么个事情: 也就是,该文章有的函数后面没 ...

  7. python 析构函数_常用的python类的魔术方法

    对于很少使用python编写大型代码的朋友可能会忘记python还是一种面向对象的语言.在其他面向对象的语言中有构造函数.析构函数等等在生命周期不同时机自动调用的函数,python当然也是有的.除此之 ...

  8. python类的特殊方法汇总_Python笔记001-类的特殊方法

    Python笔记001-类的特殊方法 以下是我学习<流畅的Python>后的个人笔记,现在拿出来和大家共享,希望能帮到各位Python学习者. 首次发表于: 微信公众号:科技老丁哥,ID: ...

  9. Python类中公开方法、私有方法和特殊方法的继承原理

    在Python中,对象的私有成员在类外部.派生类或程序中无法直接访问,但是可以通过"对象名._类名__私有成员名"这样一种特殊的形式来访问. 基类的构造方法和公开方法可以在类的外部 ...

最新文章

  1. 泰晤士报华科计算机排名,国内大学排行被“高估”的三所985大学,实力远小于排名,你认可吗?...
  2. MaxCompute大数据实践,电商数据仓库选择雪花还是星型模型?
  3. Self-training在目标检测任务上的实践
  4. 如何迅速掌握并提高linux运维技能
  5. CentOS7的初始配置
  6. Mongodb索引及explain
  7. python需要cpu还是显卡问题_买新电脑是cpu重要还是显卡重要?该怎么选择?
  8. python开发数据管理系统客户桌面_实践是最好的老师:给中级 Python 开发人员的 13 个项目构想...
  9. 从零写一个操作系统之booting
  10. 牛客网数据开发题库_牛客网刷题笔记--数据库
  11. dubbo之使用nacos作为注册中心
  12. 给定一个 32 位有符号整数,将整数中的数字进行反转。
  13. Liunx配置yum源与本地配置yum源
  14. Eclipse安装过程
  15. vue中使用接口(搜狐接口)获取访客IP地址
  16. 基于android的通讯录,基于Android的通讯录管理系统.doc
  17. Planet-在Word里添加格式美丽的代码
  18. 20 Rest高级客户端实践(六):搜索入门和基本API介绍
  19. 3D视觉:为工业机器人配备一双“火眼金睛”
  20. html文件必须由特定的程序进行编译和执行才能显示,这种编译器就是,计算机基础知识题库...

热门文章

  1. 整理:用matlab创作歌曲(一)
  2. net::ERR_CONTENT_LENGTH_MISMATCH 206 (Partial Content) 报错
  3. 面向对象设计原则:开闭原则(OCP)
  4. 树莓派zero+mysql_树莓派zero初步调试
  5. Error: Flash Download failed - “Cortex-M3“错误解决办法
  6. 【分享】如何测试微信小程序!
  7. Linux下automake应用
  8. SQL*Plus 系统变量之55 - TIMI[NG]
  9. 宽表和窄表概念和优缺点
  10. 微信怎么使用手机号码收款转账?