1.item

# __getitem__ __setitem__ __delitem__    obj['属性']操作触发

class Foo:
def __getitem__(self, item):
return self.__dict__[item] def __setitem__(self, key, value):
self.__dict__[key] = value def __delitem__(self, key):
self.__dict__.pop(key) f = Foo()
f.name = 'zq'
f.age =
print(f.__dict__) del f.name
print(f.__dict__) print(f.age)

2.str repr

class Foo:
def __init__(self,name,age):
self.name = name
self.age = age def __str__(self):
return "定制__str__ %s %s" %(self.name,self.age) def __repr__(self):
return "定制的__repr__ 替换__str__" f = Foo("zhangsan","") # 改变对象的字符串显示
# __str__
# __repr__ 在解释器中触发 当和str同时存在执行str,当str不存在,执行repr,是str的替代者
# str(f) > f.__str__()> "定制__str__"
print(f) # 定制__str__ zhangsan 12

3.format定制

# 自定制 format
class Date:
def __init__(self, year, month, day):
self.year = year
self.month = month
self.day = day def __format__(self, format_spec=""):
return "{0.year}{format_spec}{0.month}{format_spec}{0.day}".format(self, format_spec=format_spec) d1 = Date('', '', '')
print(format(d1)) #
print(format(d1, ':')) # 2018:12:12

4.slot 类变量

# __slots__ 是一个类变量 可以是list tunple iter...
# 减少内存使用 取代__dict__的属性 不再有__dict__
# 1.限制创建属性
class Foo:
__slots__ = ['name', 'age'] # 类似属性字典 定义字典中key {'name':None,'age':None} f1 = Foo()
f1.name = 'zhangsan'
f1.age = 100
# print(f1.__dict__) # AttributeError: 'Foo' object has no attribute '__dict__'
print(f1.__slots__) # ['name', 'age']
print(f1.name, f1.age)
# f1.gender = 'man' # AttributeError: 'Foo' object has no attribute 'gender'

5.doc

# __doc__ 文档注释 改属性不可被继承
class Foo:
'''
我是Foo文档信息
'''
pass class A(Foo):
'''
我是A文档信息
'''
pass print(Foo.__doc__) # 我是Foo文档信息
print(A.__doc__) # 我是A文档信息

6.module class

# __module__ 查看由那个module产生
# __class__ 查看由那个类产生
import c
c = c.c()
print(c.name)
print(c.__module__)
print(c.__class__)

7.析构方法 __del__ 当对象在内存中被释放时,自动触发执行

# __del__ 析构函数 删除实例才触发该函数
class Foo:
def __init__(self, name):
self.name = name def __del__(self):
print("__del__ 实例") f1 = Foo('zhangsan')
del f1.name # 先删除实例的属性 再执行下面语句 然后删除实例 执行析构函数
print("--------->")

8.call方法

# call 对象后面加(),触发执行
# call 类()执行 会触发__call__ 函数 Foo()
class Foo:
def __call__(self, *args, **kwargs):
print("触发实例 obj()") f1 = Foo()
f1()
Foo()

9.迭代器协议 next iter

# 迭代器协议:对象必须有一个next方法,执行一次返回迭代下一项,直到Stopiteration,
# __iter___ 把一个对象变成可迭代对象
class Foo:
def __init__(self, age):
self.age = age def __iter__(self):
return self def __next__(self):
if self.age == 197:
raise StopIteration("end")
self.age += 1
return self.age f1 = Foo(195)
print(f1.__next__())
print(f1.__next__())
# print(f1.__next__()) for i in f1: # for循环调用f1中的iter方法变成可迭代对象 再执行next方法 iter(f1)==f1.__iter__()
print(i) # 斐波那契数列
class Fib:
def __init__(self, num):
self._x = 1
self._y = 1
self.num = num def __iter__(self):
return self def __next__(self):
self._x, self._y = self._y, self._x + self._y
if self._x > self.num:
raise StopIteration("结束")
return self._x def show_fib(self):
l = []
for i in self:
l.append(i)
return l #求1000内的数
f1 = Fib(100000)
print(f1.show_fib())

10.描述符

描述符是什么:描述符本质就是一个新式类,在这个新式类中,至少实现了__get__(),__set__(),__delete__()中的一个,这也被称为描述符协议
__get__():调用一个属性时,触发
__set__():为一个属性赋值时,触发
__delete__():采用del删除属性时,触发

#描述符Str
class Str:
def __get__(self, instance, owner):
print('Str调用')
def __set__(self, instance, value):
print('Str设置...')
def __delete__(self, instance):
print('Str删除...') #描述符Int
class Int:
def __get__(self, instance, owner):
print('Int调用')
def __set__(self, instance, value):
print('Int设置...')
def __delete__(self, instance):
print('Int删除...') class People:
name=Str()
age=Int()
def __init__(self,name,age): #name被Str类代理,age被Int类代理,
self.name=name
self.age=age #何地?:定义成另外一个类的类属性 #何时?:且看下列演示 p1=People('alex',18) #描述符Str的使用
p1.name
p1.name='egon'
del p1.name #描述符Int的使用
p1.age
p1.age=18
del p1.age #我们来瞅瞅到底发生了什么
print(p1.__dict__)
print(People.__dict__) #补充
print(type(p1) == People) #type(obj)其实是查看obj是由哪个类实例化来的
print(type(p1).__dict__ == People.__dict__) 描述符应用之何时?何地?

注意事项:
一 描述符本身应该定义成新式类,被代理的类也应该是新式类
二 必须把描述符定义成这个类的类属性,不能为定义到构造函数中
三 要严格遵循该优先级,优先级由高到底分别是
1.类属性
2.数据描述符
3.实例属性
4.非数据描述符
5.找不到的属性触发__getattr__()

11.开发规范

# 软件开发规范 范例
'''
bin 脚本文件
start.py 启动文件 conf
settings.py 配置文件 db 用户数据
admin
classes
teacher
course
cource_to_school
student lib 公共类库
commons.py log 日志信息 src或core 核心文件 #导入模块
# BASER_DIR
import sys, os BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(BASE_DIR)

参考:http://www.cnblogs.com/linhaifeng/articles/6204014.html

python item repr doc format slots doc module class 析构 call 描述符的更多相关文章

  1. 如何正确地使用Python的属性和描述符

    关于@property装饰器 在Python中我们使用@property装饰器来把对函数的调用伪装成对属性的访问. 那么为什么要这样做呢?因为@property让我们将自定义的代码同变量的访问/设定联 ...

  2. Python中属性和描述符的简单使用

    Python的描述符和属性是接触到Python核心编程中一个比较难以理解的内容,自己在学习的过程中也遇到过很多的疑惑,通过google和阅读源码,现将自己的理解和心得记录下来,也为正在为了该问题苦恼的 ...

  3. Python 中的属性访问与描述符

    在Python中,对于一个对象的属性访问,我们一般采用的是点(.)属性运算符进行操作.例如,有一个类实例对象foo,它有一个name属性,那便可以使用foo.name对此属性进行访问.一般而言,点(. ...

  4. Python中的属性访问与描述符

    Python中的属性访问与描述符 请给作者点赞--> 原文链接 在Python中,对于一个对象的属性访问,我们一般采用的是点(.)属性运算符进行操作.例如,有一个类实例对象foo,它有一个nam ...

  5. python高级编程之描述符与属性02

    # -*- coding: utf-8 -*- # python:2.x __author__ = 'Administrator' #元描述符 #特点是:使用宿主类的一个或者多个方法来执行一个任务,可 ...

  6. Python描述符 (descriptor) 详解

    1.什么是描述符? python描述符是一个“绑定行为”的对象属性,在描述符协议中,它可以通过方法重写属性的访问.这些方法有 __get__(), __set__(), 和__delete__().如 ...

  7. Python强大的格式化format

    原文地址:http://www.jb51.net/article/63672.htm 自python2.6开始,新增了一种格式化字符串的函数str.format(),可谓威力十足.那么,他跟之前的%型 ...

  8. (转)Python 字符串格式化 str.format 简介

    原文:https://www.cnblogs.com/wilber2013/p/4641616.html http://blog.konghy.cn/2016/11/25/python-str-for ...

  9. python代码迷之错误(ModuleNotFoundError: No module named 'caffe.proto')

    1.pandas.read_csv book[n]下的print(n) 总图片数是少一张的,print(n)发现也是少了一个序号 仔细查找后发现缺少99号,即最后一张图片没有被读取.print(m)时 ...

随机推荐

  1. [意识流]简单易懂的AC自动机

    为了一言不合就徒手敲AC自动机,决定看一下原理 于是花了一张图, 参考HDU2222的样例 于是看懂这张图的你很快就敲出了如下代码并且AC了 #include<bits/stdc++.h> ...

  2. [转] Ansible 内置变量参考

    Quick reference for Ansible variables [From] https://github.com/lorin/ansible-quickref

  3. SPSS学习系列之SPSS Statistics的使用介绍

    不多说,直接上干货! 首先,在自己电脑找到软件. 大家根据自己的需求,我这里是双击IBM SPSS Statistics 24 打开后,如下的界面 以上就是SPSS的初步一个界面. 欢迎大家,加入我的 ...

  4. PHP之mb_substr使用

    mb_substr (PHP 4 >= 4.0.6, PHP 5, PHP 7) mb_substr - Get part of string mb_substr - 获取部分字符串 Descr ...

  5. InnoDB的后台线程(IO线程,master线程,锁监控线程,错误监控线程)和内存(缓冲池,重做日志缓冲池,额外内存池)

    InnoDB有多个内存块,你可以认为这些内存块组成了一个大的内存池,负责如下工作: 维护所有进程/线程需要访问的多个内部数据结构. 缓存磁盘上的数据,方便快速地读取,并且在对磁盘文件的数据进行修改之前 ...

  6. 枚举类型与Switch

    1.枚举类型,就是一个集合,集合内所有的元素都是枚举类型的, 主要是应用在可预计的集合中,(你知道它的值就只有那么几种情况,这时就可以使用枚举类型) 如: //结果一般只有两种,成功与失败 publi ...

  7. AngularJS 的常用特性(三)

    6.表达式  在模板中使用表达式是为了以充分的灵活性在模板.业务逻辑和数据之间建立联系,同时又能避免让业务逻辑渗透到模板中. <div ng-controller="SomeContr ...

  8. session_start()导致history.go(-1)返回时无法保存表单数据的解决方法

    问题背景: 在填写完表单提交时,由于某个表单项可能填写的不合法,导致提交失败,返回表单页面.但返回后所有的表单都被清空了,重新填写比较麻烦,度娘解释说,是由于每个页面都调用了session_start ...

  9. 腾讯云技术专家卢萌凯手把手教你Demo一个人脸识别程序!

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文来自腾讯云技术沙龙,本次沙龙主题为Serverless架构开发与SCF部署实践 卢萌凯:毕业于东南大学,曾就职于华为,熟悉云行业解决方案 ...

  10. 3行代码,为QQ轻游戏加上语音互动能力

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由腾讯游戏云 发表于云+社区专栏 游戏和社交往往有着密不可分的关系,QQ轻游戏就是一款集成在手Q里面的游戏平台,直接通过手Q入口就能随开 ...