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 = name
self.gender = gender def __call__(self, age):
"""
把类实例化对象当做一个方法调用; Usage:
>>> rg_obj=Rgc('rg','man')
>>> rg_obj(14)
>>> 14 >>> Rgc('rg','man')(14)
>>> 14 :param age:
:return:
"""
print("""把类实例化对象当做一个方法调用;""")
return age def __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 self def __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 = num
self.mana_list.append(num)
self.mana_dict[num] = self def __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 third print(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 = 1
a = 4 def __init__(self, nu):
self.nu = nu def __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 = 1
a = 4 def __init__(self, nu):
self.nu = nu def __getattribute__(self, item):
"""
此方法 叫 属性访问拦截器,此拦截器是 属性访问顺序中 优先级最高的,会先执行此方法的代码;
属性查找顺序为:
实例的__getattribute__-->实例对象字典-->实例所在类字典-->实例所在类的父类(MRO顺序)字典-->实例所在类的__getattr__-->报错 waring: 注意此方法 如果 return self.item 会造成 死循环
:param item:
:return:
"""
print('start getattribute func')
if item == 'nu':
return True
return False te_one = AttTestOne(22)
print(te_one.nu) print('*' * 20) class SetattTest(object):
private = ['age'] def __init__(self, job):
self.job = job def __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=value
if 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的访问限制 Python支持面向对象,其对属性的权限控制通过属性名来实现,如果一个属性有双下划线开头(__),该属性就无法被外 ...

  2. python类之魔法方法

    python类之魔法方法: class A(object): def __init__(self,x): self.x = x def __neg__(self): print('-v') def _ ...

  3. Python学习笔记之面向对象编程(三)Python类的魔术方法

    python类中有一些方法前后都有两个下划线,这类函数统称为魔术方法.这些方法有特殊的用途,有的不需要我们自己定义,有的则通过一些简单的定义可以实现比较神奇的功能 我主要把它们分为三个部分,下文也是分 ...

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

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

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

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

  6. Python 类的魔术方法

    Python中类的魔术方法 在Python中以两个下划线开头的方法,__init__.__str__.__doc__.__new__等,被称为"魔术方法"(Magic method ...

  7. 全面解析python类的绑定方法与非绑定方法

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

  8. python类的__repr__方法

    python3中的类默认是新式类(继承object类). __repr__()是 Python 类中的一个特殊方法,由于 object 类己提供了该方法, 而所有 的 Python 类都是 objec ...

  9. Python 类中__init__()方法中的形参与如何修改类中属性的值

    一.__init__()方法 如果__init__()方法为 class Cat(): def __init__(self,num) : self.num=num Python中类的__init__( ...

随机推荐

  1. 开发Canvas 绘画应用(二):实现绘画

    开发Canvas 绘画应用(一):搭好框架 中我们已经把基本框架及基础功能实现了,现在要实现本应用的重点:绘画功能. 首先分析一下,我们要实现绘画,需要具备的理论知识如下: (1)获取触摸点的坐标 类 ...

  2. svg 图片

    https://studio.qcloud.coding.net/rs2/d67e3c26b502365f8ab7c05d71c70471.svg 腾讯编辑器loading页面的svg

  3. oracle控制文件问题

    下午时连接数据库突然发现连不上了,监听报错找不到服务,于是登录数据库所在服务器,查看监听状态,oracle:lsnrctl status 监听状态正常,登入数据库查看[oracle@frkdb1 ~] ...

  4. vue day6 分页显示

    @{ ViewBag.Title = "Home Page"; Layout = null; } <!DOCTYPE html> <html> <he ...

  5. jsp(待改)

    ##JSP 1.指令 作用:用于配置JSP页面,导入资源文件 *书写格式 <%@ 指令名称 属性1=值1,属性2=值2  ...%> *分类: *page :配置JSP页面的 #属性: c ...

  6. 学习笔记CB008:词义消歧、有监督、无监督、语义角色标注、信息检索、TF-IDF、隐含语义索引模型

    词义消歧,句子.篇章语义理解基础,必须解决.语言都有大量多种含义词汇.词义消歧,可通过机器学习方法解决.词义消歧有监督机器学习分类算法,判断词义所属分类.词义消歧无监督机器学习聚类算法,把词义聚成多类 ...

  7. Linux第六节课学习笔记

    if条件测试语句可以让脚本根据实际情况自动执行相应的命令,可以分为单分支.双分支与多分支. /dev/null为无回收功能的垃圾箱. read是用来读取用户输入信息的命令,-p用来显示提示信息. fo ...

  8. Ubuntu系统安装Transmission

    虚拟机Ubuntu 16.10 Transmission 2.92(https://launchpad.net/~transmissionbt/+archive/ubuntu/ppa) 一.添加源 s ...

  9. c# 使用 namedpipe 通信

    using System; using System.IO; using System.IO.Pipes; using System.Diagnostics; using System.Threadi ...

  10. Windows10 小闹钟

    Windows 10 自带小闹钟功能,便于我们进行时间管理,到点提醒. 尤其作为IT的工作者,首先要保证身体的健康,要定好休息的时间,哪怕5分钟,也能让人满血复活. 其次,便于我们将各种优先级的事务进 ...