#type() 来判断对象类型#判断基本数据类型可以直接写intstr等print(type(123)type(456))#判断一个对象是否是函数怎么办可以使用types模块中定义的常量importtypestype(abs)types.BuiltinFunctionType 使用dir() 如果要获得一个对象的所有属性和方法可以使用dir()函数它返回一个包含字符串的list比如获得一个str对象的所有属性和方法 print(dir(ABC))classStudent(object):def__int__(self,name):self.namename#s Student(Bob)#s.score 90classStudent(object):nameStudentsStudent()# 创建实例s#print(s.name) # 打印name属性因为实例并没有name属性所以会继续查找class的name属性s.nameMichael# 给实例绑定name属性#print(s.name) # 由于实例属性优先级比类属性高因此它会屏蔽掉类的name属性#print(Student.name) # 但是类属性并未消失用Student.name仍然可以访问dels.name# 如果删除实例的name属性print(s.name)# 再次调用s.name由于实例的name属性没有找到类的name属性就显示出来了#为了统计学生人数可以给Student类增加一个类属性每创建一个实例该属性自动增加classStudent(object):count0def__init__(self,name):self.namename Student.count1# 测试:ifStudent.count!0:print(测试失败!)else:bartStudent(Bart)ifStudent.count!1:print(测试失败!)else:lisaStudent(Bart)ifStudent.count!2:print(测试失败!)else:print(Students:,Student.count)print(测试通过!)#把Student的gender属性改造为枚举类型可以避免使用字符串fromenumimportEnum,unique# 定义性别枚举classGender(Enum):Male0Female1# 定义学生类classStudent(object):def__init__(self,name,gender):self.namename# 关键检查传入的 gender 是否属于 Gender 枚举类型ifnotisinstance(gender,Gender):raiseValueError(gender must be an instance of Gender enum)self.gendergender# 测试代码# 1. 正确的用法bartStudent(Bart,Gender.Male)ifbart.genderGender.Male:print(测试通过!)# 2. 错误的用法会被拦截try:# 这里试图用字符串会抛出异常aliceStudent(Alice,Male)exceptValueErrorase:print(f错误被捕获{e})#异常try:print(try...)r10/2print(result:,r)exceptZeroDivisionErrorase:print(except:,e)finally:print(finally...)print(END)try:print(try...)r10/int(2)print(result:,r)exceptValueErrorase:print(ValueError:,e)exceptZeroDivisionErrorase:print(ZeroDivisionError:,e)else:print(no error!)finally:print(finally...)print(END----)try:print(try...)r10/int(2)print(result:,r)exceptValueErrorase:print(ValueError:,e)exceptZeroDivisionErrorase:print(ZeroDivisionError:,e)else:print(no error!)finally:print(finally...)print(END)# err.py:def foo(s): return 10 / int(s) def bar(s): return foo(s) * 2 def main(): bar(0) main() #同样是出错但程序打印完错误信息后会继续执行并正常退出importloggingdeffoo(s):return10/int(s)defbar(s):returnfoo(s)*2defmain():try:bar(0)exceptExceptionase:logging.exception(e)main()print(END) def foo(s): n int(s) if n0: raise ValueError(invalid value: %s % s) return 10 / n def bar(): try: foo(0) except ValueError as e: print(ValueError!) raise bar() try: 10 / 0 except ZeroDivisionError: raise ValueError(input error!) #运行下面的代码根据异常信息进行分析定位出错误源头并修复 from functools import reduce def str2num(s): try: # 尝试转换为数字 return float(s) except ValueError as e: # 如果转换失败抛出带有更详细信息的异常 raise ValueError(f无法将 {s.strip()} 转换为数字) from e def calc(exp): try: ss exp.split() # 将 map 对象转换为列表以便立即触发 str2num 的执行和异常 ns list(map(str2num, ss)) return reduce(lambda acc, x: acc x, ns) except ValueError as e: # 捕获并处理 str2num 中抛出的 ValueError print(f计算表达式 {exp} 时出错: {e}) return None # 或者返回一个默认值如 0 def main(): # 测试有效的表达式 r calc(100 200 345) if r is not None: print(100 200 345 , r) # 测试包含无效数字的表达式 r calc(99 88 7.6.7) # 注意这里故意写错了多了一个点 if r is not None: print(99 88 7.6.7 , r) # 测试另一个有效表达式证明程序没有崩溃 r calc(10 20 30) if r is not None: print(10 20 30 , r) main() importloggingdeffoo(s):nint(s)logging.info(n %d%n)logging.basicConfig(levellogging.INFO)return10/ndefmain():foo(0)main()