item repr doc format slots doc module class 析构 call 描述符 开发规范

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 = 123
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","12")

# 改变对象的字符串显示
# __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(‘2018‘, ‘12‘, ‘12‘)
print(format(d1))  # 20181212
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

原文地址:https://www.cnblogs.com/icemonkey/p/10457935.html

时间: 2024-10-16 01:40:40

item repr doc format slots doc module class 析构 call 描述符 开发规范的相关文章

elastic-job集成到springboot教程,和它的一个异常处理办法:Sharding item parameters '1' format error, should be int=xx,int=xx

先说这个Sharding item parameters '1' format error, should be int=xx,int=xx异常吧,这是在做动态添加调度任务的时候出现的,网上找了一会没有搜到任何信息,最后发现,是添加任务这个方法里有一个漏洞. 这个源码出自: 1 private ShardingItem parse(final String shardingItemParameter, final String originalShardingItemParameters) {

No Such module Alamofire 加载 Alamofire 到开发目录

加载Alamofire时出现提示: underlying Objective-C module 'Alamofire' not found 基本操作是按照github 中操作的. https://github.com/Alamofire/Alamofire 但是还是弹出这种提示: 其实加载Alamofire很简单. 官方是说在the Link Binary With Libraries 中添加,其实都可以. 重点是: 如果当前在真机测试环境下,需要切换到模拟器中编译,然后切换回真机即可.

Module Zero模块 [X-Admin&ABP框架开发-RBAC]

在业务系统需求规划过程中,通常对于诸如组织机构.用户和角色等这种基础功能,通常是将这部分功能规划到通用子域中,这也说明了,对于这部分功能来讲,是系统的基石,整个业务体系是建立于这部分基石之上的,当然,还有诸如多语言.设置管理.认证和授权等.对于这部分功能,ABP中存在这些概念,并且通过Module Zero模块完成了这些概念. 一.角色访问控制之RBAC RBAC:Role Based Access Control,基于角色的访问控制,这在目前大多数软件中来讲已经算得上是普遍应用了,最常见的结构

【译】x86程序员手册25-7.1任务状态段

7.1 Task State Segment 任务状态段 All the information the processor needs in order to manage a task is stored in a special type of segment, a task state segment (TSS). Figure 7-1 shows the format of a TSS for executing 80386 tasks. (Another format is used

六 面向对象高级属性

一 isinstance(obj,cls)和issubclass(sub,super) 二 反射 三 __setattr__,__delattr__,__getattr__ 四 二次加工标准类型(包装) 五 __getattribute__ 六 描述符(__get__,__set__,__delete__) 六 再看property 七 __setitem__,__getitem,__delitem__ 八 __str__,__repr__,__format__ 九 __slots__ 十 __

How to Write Doc Comments for the Javadoc Tool

http://www.oracle.com/technetwork/java/javase/documentation/index-137868.html This document describes the style guide, tag and image conventions we use in documentation comments for Java programs written at Java Software, Oracle. It does not rehash r

ORA-20011 ORA-29913 and ORA-29400 with Associated KUP-XXXXX Errors from DBMS_STATS.GATHER_STATS_JOB(Doc ID 1274653.1)

首先在alert log裡面頻繁的看見如下錯誤: DBMS_STATS: GATHER_STATS_JOB encountered errors.  Check the trace file. Errors in file /oracle/diag/rdbms/phalr/phalr/trace/phalr_j001_5306.trc: ORA-20011: Approximate NDV failed: ORA-29913: error in executing ODCIEXTTABLEOPE

Spire.DOC生成表格测试

首先,很感谢Jack对我的信任,让我来写一个评测,在此对Jack说一声抱歉,由于本人愚钝,并且最近项目比较紧张,把评测这个事情脱了一个月之久,由于往后的日子可能更忙,所以今晚抽空只能只写了一个小程序来测试. Spire系列的Word,PDF,Excel,Presentation是一套专为.NET开发人员设计的控件.使用该套工具,程序员可以在任意.NET平台上对Office文件.PDF文档进行生成,读取,编辑,修改,转换格式等处理,且不需要安装MS Office. 红字部分的内容,是有Jack给我

Go语言之Doc 文档

对于协作开发或者代码共享来说,文档是一个可以帮助开发者快速了解以及使用这些代码的一个教程,文档越全面.越详细,入门越快,效率也会更高. 在Go语言中,Go为我们提供了快速生成文档以及查看文档的工具,让我们可以很容易地编写查看文档. Go提供了两种查看文档的方式:一种是使用go doc命令在终端查看.这种适用于使用VIM等工具在终端开发的人员,他们不用离开终端,既可以查看想查看的文档,又可以编码. 第二种方式,是使用浏览器查看的方式.通过godoc命令可以在本机启动一个Web服务,我们可以通过打开