程序员之所以犯错误,不是因为他们不懂,而是因为他们自以为什么都懂。
try:
r = 10 / 0
except ZeroDivisionError as e:
print(e)
r = 1
else:
print('没有异常')
finally:
print('不管有没有异常都执行')
print(r)
结果 :
division by zero
不管有没有异常都执行
1python中的异常处理
class Fib100:
def __init__(self):
print("初始化")
self._1, self._2 = 0, 1
def __iter__(self):
return self
def __next__(self):
self._1, self._2 = self._2, self._1 + self._2
if self._1 > 1000:
raise StopIteration()
return self._1
def setting(self,number1,number2):
self._1=number1
self._2=number2
a=Fib100()
a.setting(10,11)
for i in a:
print(i)
# for i in Fib100():
# print(i)
结果 :
初始化
11
21
32
53
85
138
223
361
584
945做的一个斐波那契数列的生成器,用__next__实现,很简单,可设置起始的数,在这里我限制了最大不能超出1000
def add(self, value):
self.append(value)
class ListMetaclass(type):
def __new__(cls, name, bases, attrs):
# print(cls)
# print(name)
# print(bases)
# print(type(attrs))
# attrs['add'] = lambda self, value: self.append(value)
attrs['add'] = add
attrs['name'] = 'Tom'
return type.__new__(cls, name, bases, attrs)
class MyList(list, metaclass = ListMetaclass): # 额外增加add方法,实际等价于append。
pass
mli = MyList()
mli.add(1)
mli.add(2)
mli.add(3)
print(mli.name)
print(mli)
结果 :
Tom
[1, 2, 3]实现的一个自定义的list,你也可以为他重写别的方法
class MyProperty:
def __init__(self, fget = None, fset = None, fdel = None):
self.fget = fget
self.fset = fset
self.fdel = fdel
def __get__(self, instance, cls):
if self.fget:
print('__get__')
return self.fget(instance)
def __set__(self, instance, value):
if self.fset:
print('__set__')
return self.fset(instance, value+1)
def __delete__(self, instance):
if self.fdel:
return self.fdel(instance)
def getter(self, fn):
print("定义getter")
self.fget = fn
def setter(self, fn):
print("定义setter")
self.fset = fn
def deler(self, fn):
print("定义deler")
self.fdel = fn
class Student:
@MyProperty
def score(self):
return self._score
@score.setter
def set_score(self, value):
#此处是第二次处理
self._score = value+10
@score.getter
def get_score(self):
#好像只有在这里才能处理
return self._score+100
s = Student()
s.score = 1000
print(s.score)
结果:
定义setter
定义getter
__set__
__get__
1111python中实现装饰器的方法,简单的实现get和set方法