python面向对象进阶

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 ,为对象而生
 
 
面向对象特性:
class Provice:

    def __init__(self,name):
        self.name = name

    def start(self):
        temp = '%s sb' %self.name
        return temp

    @property#获取特性,将方法伪造成一种字段
    def end(self):
        temp = '%s sb' % self.name
        return temp
    @end.setter#设置特性,如果要设置特性:获取特性的方法名需等于设置特性的方法名
    def end(self,value):
        print(value)
        self.name = value#把上面的self.name值zc改为了123

obj = Provice('zc')
ret1 = obj.start()
print(ret1)
print(obj.end)#伪造成字段后可以不用加括号执行
obj.end = '123'#把123传给上面的value
print(obj.end)
# 打印
# zc sb
# zc sb
# 123
# 123 sb

成员分为:

      字段 :静态字段(没个对象都有一份),   普通字段(每个对象都不同的数据)

    方法:静态方法(无需使用对象封装的内容)  ,  类方法 ,   普通方法(使用对象中的数据)

    特性:普通特性(将方法伪造成字段)

判断 类和对象的执行:

有self是对像调用

无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    用户代码生成的警告

   



原文地址:https://www.cnblogs.com/zcok168/p/9163584.html