========================================开发规范=======================================
1.软件开发规范
1.1目录结构----有组织的目录结构
Project-
bin
start.py#启动脚本
conf
setting.py#设置
db
mysql.sql#数据库
lib
commons.py#公共的类库
log
log.py#日志信息
src/core
#主要的核心的程序逻辑
========================================call方法=======================================
class Foo():
pass
def __call__(self, *args, **kwargs):
print('我执行啦obj()')
f1=Foo()
f1()#调用的就是__call__方法
========================================doc属性=========================================
class Foo():
'我是描述信息'
pass
class Bar():
pass
print(Foo.__dict__)
print(Bar.__dict__)
========================================反射的详细介绍===================================
import test as obj
print(obj)
print(hasattr(obj,'say_hi'))
print(hasattr(obj,'say_hissssssssssssssss'))
if hasattr(obj,'say_hi'):
func=getattr(obj,'say_hi')
func()
else:
print('其他的函数')
import sys
print('来自自己的函数')
b1=sys.modules[__name__]
# import fangse as obj1
import sys
obj1=sys.modules[__name__]
print('你好',hasattr(obj1,'x'))
========================================file文件========================================
import sys
#print(sys.argv)#获取平台获取当前的文件路径
sys.exit()
sys.version
sys.path
sys.stdin
sys.stdout
sys.stderror
========================================getattribute====================================
class Foo():
def __init__(self,x):
self.x=x
def __getattr__(self, item):
print('执行的是我')
def __getattribute__(self, item):
print('执行的是getattribute')
raise AttributeError('抛出异常啦')
f1=Foo(10)
f1.xxx#执行找不到的属性访问执行getattr方法
f1.x
#调用首先执行—- __getattribute方法,不存在的情况下执行
========================================getattribute补充================================
print('----------------------')
print('----------------------')
print('----------------------')
# class Foo():
# def __init__(self,x):
# self.x=x
#
# def __getattr__(self, item):
# print('执行的是我')
# def __getattribute__(self, item):
# print('执行的是getattribute')
# raise AttributeError('抛出异常啦')
#
# f1=Foo(10)
# f1.xxx#执行找不到的属性访问执行getattr方法
# f1.x
# #调用首先执行—- __getattribute方法,不存在的情况下执行
raise AttributeError('自己找事')
print('----------------------')
print('----------------------')
print('----------------------')
========================================index方法=======================================
from lib.aa import C
c1=C()
print(c1.name)
print(c1.__module__)#来之哪一个模块
print(c1.__class__)#来之哪一个类产生
========================================item系列方法====================================
class Foo():
def __getitem__(self, item):
print('getitem')
def __setitem__(self, key, value):
print('setitem')
def __delitem__(self, key):
print('delitem')
f1=Foo()
print(f1.__dict__)
#通过点访问的死 getattr
#当调用字典的时候才调用item
f1['name']='eoulen'
f1['age']=18
print('---->>>',f1.__dict__)
del f1['name']
print(f1.__dict__)
========================================slots方法========================================
#__slots__是什么:是一个类变量,变量值可以使列表,元组,
class Foo():
__slots__ = {'name','age'}
f1=Foo()
print(Foo.__slots__)
print(f1.__slots__)
#使用__slots主要是进行内存的减小
f1.name='oulen'
f1.age=18
#f1.gender='male'/////AttributeError: 'Foo' object has no attribute 'gender'
#当当前的类存在__slots__ , __dict__不会被使用
========================================内置函数=========================================
class Foo():
pass
class Bar(Foo):
pass
f1=Foo()
print(isinstance(f1,Foo))#检查obj是否是CLS类的实例
print(issubclass(Foo,Bar))#检查Foo是否是继承BAR
========================================描述符===========================================
class Foo():
def __get__(self, instance, owner):
print('get方法')
def __set__(self, instance, value):
print('set方法')
instance.__dict__['x']=value
def __delete__(self, instance):
print('delete方法')
f1=Foo()
f1.name='oulen'
#当前的实例方法不会触发这个方法
#用来代理另外一个类的属性的时候
class Bar():
x=Foo()#当另外一个类的属性是另外一个类
#在何地
def __init__(self,n):
self.x=n
b1=Bar(11)
print(b1.x)
print(b1.__dict__)
b1.x=18
#del b1.x
print(b1.__dict__)
#数据描述符号
#有__set__数据描述符
#没有__set__就是非数据描述符
#描述符必须在新式类中
#注意事项:
#1.类属性
#2.数据描述符
#3.实例属性
#4.非数据描述符
#5.找不到属性触发__getattr__()
========================================描述符优先级======================================
class Foo:
def __get__(self, instance, owner):
print('===>get方法')
def __set__(self, instance, value):
print('===>set方法',instance,value)
# instance.__dict__['x']=value #b1.__dict__
def __delete__(self, instance):
print('===>delete方法')
class Bar:
x=Foo() #在何地?
Bar.x=1
print(Bar.x)
#----------------优先级的定义
#注意事项:
#1.类属性
#2.数据描述符
#3.实例属性
#4.非数据描述符 没有__set__方法
#5.找不到属性触发__getattr__()
b1=Bar()#
b1.x #get
b1.x=1 #set
del b1.x #delete
========================================改变对象的字符串显示===============================
# l=list('hello')
# print(1)
# file=open('test.txt','w')
# print(file)
#
# class Foo():
# def __init__(self,name,age):
# self.name=name
# self.age=age
# def __str__(self):
# return '名字是%s 年龄是%s'%(self.name,self.age)
# # def __str__(self):
# # return "自定制的显示方式"
# f1=Foo('engon',18)
# print(f1)
# print(f1.name)#--str __ f1.str
# x=str(f1)
# print(x)
class Foo():
def __init__(self,name,age):
self.name=name
self.age=age
# def __str__(self):
# return '名字是%s 年龄是%s'%(self.name,self.age)
# def __str__(self):
# return "自定制的显示方式"
def __repr__(self):
return '名字是%s 年龄是%s'%(self.name,self.age)
f1=Foo()
#repl 用于在解释器使用
#str 使用的是print 使用 print -str _>> 没有的情况下选择到 __repl__的方法
#
'''
str 函数或者是print 函数 ——》》 obj.__str__()
repr 或是解释器交互式——————》》obj.__repr__()
如果定义的__str__没有被定义,那么就使用__repr__来代替输出
注意这两者的方法的返回值必须是字符串,否则抛出异常
'''
========================================析构方法==========================================
class Foo():
def __init__(self,name):
self.name=name
def __del__(self):
print('我执行啦')
f1=Foo('oulen')
del f1.name
print('-----------》》》》》》')
========================================自定制格式化方法===================================
# x='{0}{0}{0}'.format('dog')
#
# print(x)
#
formate_dic={
'ymd':'{0.year}:{0.mon}:{0.day}',
'm-d-y':'{0.year}:{0.mon}:{0.day}',
'y:m:d':'{0.mon}-{0.day}-{0.year}'
}
class Date:
def __init__(self,year,mon,day):
self.year=year
self.mon=mon
self.day=day
def __format__(self, format_spec):
print('我执行啦')
print('我执',format_spec)
if not format_spec or format_spec not in formate_dic:
format_spec='ymd'
fm=formate_dic[format_spec]
return fm.format(self)
#return '{0.year}:{0.mon}:{0.day}'.format(self)
d1=Date(2016,12,26)
format(d1)
print(format(d1))
print(format(d1,'y:m:d'))
print(format(d1,'m-d-y'))
print(format(d1,'m-d'))
#
# x='{0.year}:{0.mon}:{0.day}'.format(d1)
# print(x)
# y='{0.year}:{0.mon}:{0.day}'.format(d1)
# z='{0.mon}-{0.day}-{0.year}'.format(d1)
# print(x)
# print(y)
# print(z)
#
========================================迭代器协议=========================================
class Foo():
def __init__(self,n):
self.n=n
def __iter__(self):
print('你好')
return self
def __next__(self):
if self.n==13:
raise StopIteration('终止啦')
self.n+=1
return self.n
# l=list('hello')
# for i in l:
# print(i)
#
f1=Foo(10)
print(f1.__next__())
print(f1.__next__())
print(f1.__next__())
print(f1.__next__())
print(f1.__next__())
print(f1.__next__())
print(f1.__next__())
# for i in f1:#iter(f1)---------f1.__iter()
# print(i)
========================================迭代器实现斐波那契数列==============================
class Fib():
def __init__(self):
self._a=1
self._b=1
def __iter__(self):
return self
def __next__(self):
if self._a > 5000:
raise StopIteration('终止啦')
self._a,self._b=self._b,self._a+self._b
return self._a
f1=Fib()
print(next(f1))
print(next(f1))
print(next(f1))
print(next(f1))
print(next(f1))
print(next(f1))
for i in f1:
print(i)