标签:sid 不同 析构 程序 ada 处理机 top var sum
class Foo:
def __init__(self,name):
self.name=name
def __getitem__(self, item):
print(self.__dict__[item])
def __setitem__(self, key, value):
self.__dict__[key]=value
def __delitem__(self, key):
print(‘del obj[key]时,我执行‘)
self.__dict__.pop(key)
def __delattr__(self, item):
print(‘del obj.key时,我执行‘)
self.__dict__.pop(item)
f1=Foo(‘sb‘)
f1[‘age‘]=18
f1[‘age1‘]=19
del f1.age1
del f1[‘age‘]
f1[‘name‘]=‘alex‘
print(f1.__dict__)
#_*_coding:utf-8_*_
__author__ = ‘Linhaifeng‘
format_dict={
‘nat‘:‘{obj.name}-{obj.addr}-{obj.type}‘,#学校名-学校地址-学校类型
‘tna‘:‘{obj.type}:{obj.name}:{obj.addr}‘,#学校类型:学校名:学校地址
‘tan‘:‘{obj.type}/{obj.addr}/{obj.name}‘,#学校类型/学校地址/学校名
}
class School:
def __init__(self,name,addr,type):
self.name=name
self.addr=addr
self.type=type
def __repr__(self):
return ‘School(%s,%s)‘ %(self.name,self.addr)
def __str__(self):
return ‘(%s,%s)‘ %(self.name,self.addr)
def __format__(self, format_spec):
# if format_spec
if not format_spec or format_spec not in format_dict:
format_spec=‘nat‘
fmt=format_dict[format_spec]
return fmt.format(obj=self)
s1=School(‘oldboy1‘,‘北京‘,‘私立‘)
print(‘from repr: ‘,repr(s1))
print(‘from str: ‘,str(s1))
print(s1)
‘‘‘
str函数或者print函数--->obj.__str__()
repr或者交互式解释器--->obj.__repr__()
如果__str__没有被定义,那么就会使用__repr__来代替输出
注意:这俩方法的返回值必须是字符串,否则抛出异常
‘‘‘
print(format(s1,‘nat‘))
print(format(s1,‘tna‘))
print(format(s1,‘tan‘))
print(format(s1,‘asfdasdffd‘))
class Student(object):
__slots__ = (‘name‘, ‘gender‘, ‘score‘)
def __init__(self, name, gender, score):
self.name = name
self.gender = gender
self.score = score
__slots__的目的是限制当前类所能拥有的属性,如果不需要添加任意动态的属性,使用__slots__也能节省内存。
class Range:
"自定义类模仿range函数"
def __init__(self,s_num,e_num,step=1):
self.s_num = s_num
self.e_num = e_num
self.step=step
def __iter__(self):
return self
def __next__(self):
if self.s_num==self.e_num:
raise StopIteration
n = self.s_num
self.s_num+=1*self.step
return n
def __del__(self):
print("dadada")
f = Range(2,20,2)
for i in f :
print(i)
class Foo:
‘我是描述信息‘
pass
print(Foo.__doc__
class Foo:
def __del__(self):
print(‘执行我啦‘)
f1=Foo()
del f1
print(‘------->‘)
#输出结果
执行我啦
------->
注:此方法一般无须定义,因为Python是一门高级语言,程序员在使用时无需关心内存的分配和释放,因为此工作都是交给Python解释器来执行,所以,析构函数的调用是由解释器在进行垃圾回收时自动触发执行的。
为了对象兼容 with...as 语句,必须在这个对象的类中声明enter和exit方法
当一个对象被用作上下文管理器时:
__enter__ 方法将在进入代码块前被调用。
__exit__ 方法则在离开代码块之后被调用(即使在代码块中遇到了异常)。
class My_open:
def __init__(self, filename, mode):#接受参数
self.filename = filename
self.mode = mode
def __enter__(self):#打开文件是会运行__enter__
self.openedFile = open(self.filename, self.mode)#获取真实文件句柄
return self.openedFile#返回句柄
def __exit__(self, exc_type, exc_val, exc_tb):#文件关闭时会运行__exit__
self.openedFile.close()
"""此处如果不对exc_type, exc_val, exc_tb进行处理的话,with下的程序出错了就会报错
可以在这里加上处理机制,如果返回非False的值就不会报错了"""
def __getattr__(self, item):#其余的方法还是直接使用原来的
return getattr(self,item)
with My_open("a.txt", "w+") as writer:
writer.write("11111111111111")
注:构造方法的执行是由创建对象触发的,即:对象 = 类名() ;而对于 call 方法的执行是由对象后加括号触发的,即:对象() 或者 类()()
class Fib(object):
"求一定长度的斐波那契数列"
def __call__(self, num):
l = []
a,b = 0,1
for i in range(num):
l.append(a)
a,b=b,a+b
return l
f = Fib()
print (f(10))
标签:sid 不同 析构 程序 ada 处理机 top var sum
原文地址:http://www.cnblogs.com/kimyeee/p/6765349.html