class A: def bar(self): print('BAR') self.F1()#查找顺序为:返回最初调用着 D ,D又找到 C ,输出C里面的F1值, 这种查找顺序不会从自身找.如上图 class B(A): def F1(self): print('B') class C: def F1(self): print('C') class D(C,B): pass d1 = D() d1.F1() d1.bar() # 打印: # C # BAR # C
继承如何执行父类的构造方法那?有两种方法如下代码:
class Annimal: def __init__(self): print('A构造方法') self.aa = '动物' class Cat(Annimal): def __init__(self): print('B构造方法') self.b = '猫' super(Cat,self).__init__()#执行父类的构造方法 # Annimal.__init__(self)#效果同上,建议使用上面那句 #类后面加入括号自动执行 c = Cat() print(c.__dict__) # 打印结果 # B构造方法 # A构造方法 # {'b': '猫', 'aa': '动物'}
面向对象成员归属:
class Foo: def __init__(self,name): self.name = name def show(self,name): self.name = name obj = Foo('zc') r = hasattr(obj,'name') print(r) #反射:对象, 即可以找对像,找类的的成员 r = hasattr(obj, 'show') print(r) # 打印 # True # True
利用反射导入模块,查找类,创建对像,找对像中的字段
m = __import__('3',fromlist=True)#导入模块,见模块下代码 class_name = getattr(m,'Foo')#去模块中找类 obj = class_name('zc')#根据类创建对象 evl = getattr(obj,'name')#去对象中找到name对应的值 print(evl) ####################################### class Foo: def __init__(self,name): self.name = name
面向对象成员之静态字段
通过类和对象都可访问以下四种,但是代码规范性必须区分访问方法:
通过类访问: 静态字段, 静态方法.类方法(相当于静态方法特殊情况)
通过对象访问: 普通字段,类的方法
class Provice: country = '中国'#静态字段 def __init__(self,name): self.name = name#普通字段(可通过对象访问) def show(self,name):#普通方法存在类中(可通过对象访问) self.name = name hebei = Provice('河北') henan = Provice('河南') print(hebei.__dict__,henan.__dict__) print(Provice.country)#通过类访问静态字段 # 打印 # {'name': '河北'} {'name': '河南'} # 中国
面向对象之静态方法
class Provice: country = '中国' def __init__(self,name): self.name = name @staticmethod#装饰类中的方法,装饰后该方法变为静态方法 def xo(arg1,arg2):#可以传任意参数 print('xo') def show(self,name): self.name = name Provice.xo(1,2)#通过类访问静态方法 hebei = Provice('河北')#通过对象访问静态方法 hebei.xo() # 打印 # xo # xo
面向对象之类方法
class Provice: country = '中国' def __init__(self,name): self.name = name @classmethod def xxoo(cls):#定义了一个类方法 print('xxoo') def show(self,name): self.name = name Provice.xxoo()#通过类访问类方法
成员存在的意义:
静态字段:存在类中 ,静态字段存在的意:把对象里面重复的数据只在类里保存一份
静态方法 :没有self 可以传参数,调用的时候也需要传入参数 ,存在的意义:不需要创建对象,就可以访问此方法 ,为类而生
类方法:必须要有个cls参数:自动传入类名
特性 对象调用 、不能加参数,执行不用加括号
普通字段, 存放在对象中
普通方法 存在的意义:普通方法如果要想被调用就需要创建self ,为对象而生
成员修饰符:
公有成员:任何地方都能访问
私有成员:只有在类的内部才能访问,定义方式为命名时,前两个字符为下划线,如 "__test"
class Foo: xo = 'xo'#静态字段,属于公有成员 __ox = 'ox'#静态字段,加__属于私有成员 def __init__(self): self.__name = 'zc'#普通字段属于私有成员 def ferch(self): print(Foo.__ox)#在类的内部访问私有静态字段 print(Foo.xo) #访问公有静态字段 obj = Foo() obj.ferch() #访问私有静态字段 # 打印 # xo # ox
小节:私有成员只能在类内部使用,其他的都不能使用包括继承的子类,可以通过间接的方式去访问(方法内部转换调用),
可以通过对象下划线类两个下划线私有字段 print(obj._Foo__name)这种方式不推荐
类的特殊成员:
class Foo: def __init__(self): print('init') def __call__(self, *args, **kwargs): print('call') return 1 r = Foo()#输出init r()#输出call r = Foo()() print(r) #Foo()生成对象输出init, Foo()()对象后面加()输出call, 返回值1 # 打印 # init # call # 1
class Foo: def __init__(self): print('init') def __getitem__(self, item): print(item) def __setitem__(self, key, value): print(key,value) def __delitem__(self, key): print(key) r = Foo() r['zc']#__getitem__方法 r['zc'] = 123#setitem方法,把zc传给了key,123传给了value del r['cz']#__delitem__方法 # 对象里面有:方括号等号关键字分别会执行方法里面的对应数据 # 打印 # init # zc # zc 123 # cz #以下py2与py3操作对比, r[1:3] #__getslice__/__getitem__ r[1:3] = [11,22,33]#__setslice__/__setitem__ del r[1:3] #__delslice/__delitem__ # 打印 # init # slice(1, 3, None) # slice(1, 3, None) [11, 22, 33] # slice(1, 3, None)
class Foo: def __iter__(self): yield 1 yield 2 yield 3 obj = Foo() #执行Foo时, 自动会执行对象的item方法,生成器 for i in obj: print(i) # 打印 # 1 # 2 # 3
类的特殊成员总结:
__doc__ 表示类的描述信息
__module__ 表示当前操作的对象在那个模块
__class__ 表示当前操作的对象的类是什么
__init__ 构造方法,通过类创建对象时,自动触发执行
__call__ 对象后面加括号,触发执行。
__dict__ 类或对象中的所有成员
__str__ 如果一个类中定义了__str__方法,那么在打印 对象 时,默认输出该方法的返回值。
__init__ 构造方法,通过类创建对象时,自动触发执行
__setitem__,__getitem__,__delitem__ 用于索引操作,如字典。分别表示获取、设置、删除数据
异常处理
异常是指该事件会在程序执行过程中发生,影响了程序的正常执行。
当Python脚本发生异常时我们需要捕获处理它,否则程序会终止执行。
inp = input('请输入内容:') try: num = int(inp) print(num) except Exception as e:#万能异常,可以捕获任意异常 print('数据类型转换失败') # 打印 # 请输入内容:sadfd # 数据类型转换失败
捕捉异常完整代码
try: #主代码块 except KeyError as q: #异常时执行该模块 pass except IndexError as q: #异常时执行该模块 pass #可以写多个捕捉异常模块,最后加上Exception except Exception as q: #异常时执行该模块 pass else: #主代码执行完执行该模块 pass finally: #无论有无异常,最终执行该模块 pass
主动触发异常:
try: print('123') raise Exception('出错了...')#主动触发错误 except Exception as q: print(q)#q里面封装了错误信息的对象 # 打印 # 123 # 出错了...
自定义异常:
class Foo: def __init__(self,arg): self.xo = arg def __str__(self): return self.xo obj = Foo('出错了....') print(obj) 打印 出错了....
标准的异常有:
BaseException 所有异常的基类
SystemExit 解释器请求退出
KeyboardInterrupt 用户中断执行(通常是输入^C)
Exception 常规错误的基类
StopIteration 迭代器没有更多的值
GeneratorExit 生成器(generator)发生异常来通知退出
StandardError 所有的内建标准异常的基类
ArithmeticError 所有数值计算错误的基类
FloatingPointError 浮点计算错误
OverflowError 数值运算超出最大限制
ZeroDivisionError 除(或取模)零 (所有数据类型)
AssertionError 断言语句失败
AttributeError 对象没有这个属性
EOFError 没有内建输入,到达EOF 标记
EnvironmentError 操作系统错误的基类
IOError 输入
/
输出操作失败
OSError 操作系统错误
WindowsError 系统调用失败
ImportError 导入模块
/
对象失败
LookupError 无效数据查询的基类
IndexError 序列中没有此索引(index)
KeyError 映射中没有这个键
MemoryError 内存溢出错误(对于Python 解释器不是致命的)
NameError 未声明
/
初始化对象 (没有属性)
UnboundLocalError 访问未初始化的本地变量
ReferenceError 弱引用(Weak reference)试图访问已经垃圾回收了的对象
RuntimeError 一般的运行时错误
NotImplementedError 尚未实现的方法
SyntaxError Python 语法错误
IndentationError 缩进错误
TabError Tab 和空格混用
SystemError 一般的解释器系统错误
TypeError 对类型无效的操作
ValueError 传入无效的参数
UnicodeError
Unicode
相关的错误
UnicodeDecodeError
Unicode
解码时的错误
UnicodeEncodeError
Unicode
编码时错误
UnicodeTranslateError
Unicode
转换时错误
Warning 警告的基类
DeprecationWarning 关于被弃用的特征的警告
FutureWarning 关于构造将来语义会有改变的警告
OverflowWarning 旧的关于自动提升为长整型(
long
)的警告
PendingDeprecationWarning 关于特性将会被废弃的警告
RuntimeWarning 可疑的运行时行为(runtime behavior)的警告
SyntaxWarning 可疑的语法的警告
UserWarning 用户代码生成的警告