类的私有成员,类方法与静态方法,属性,isinstance、issubclass,异常处理

安稳与你 提交于 2020-04-01 04:32:25

1.类的私有成员

类中的私有成员: 私有类的静态属性, 私有对象属性,私有方法
=>类外部、派生类不可访问,内部可以访问
以私有属性为例:
class B:
    school_name = '老男孩教育'
    __consc_edu = '良心教育'
class A(B):
    class_name = 'python23'
    __girlnum = '1个'
    def func(self):
        print(self.__girlnum)
    def func1(self):
        print(self.__consc_edu)
obj = A()
print(obj.__girlnum)   #类外部不可访问
print(A.__girlnum)     #类外部不可访问
obj.func1()            #派生类不可访问
obj.func()    #内部可以访问
拓展:
class A:
    __girlnum = '1个'
    
print(A.__dict__)
python中所有的私有成员: 就是在私有成员前面加上 _类名而已
print(A._A__girlnum)  #千万不要这么去访问!

2.类方法与静态方法

class A:
    def func(self):
        print('实例方法')
    @classmethod  # 类方法: 由类名直接调用的方法,会自动的将类名传给cls
    def a_func(cls):
        print('这是类方法')
A.a_func()
obj=A()
obj.a_func()  # 对象也可以调用类方法,但是会自动将其从属于的类名传给cls
# 定义一个Student类,统计学生的个数
class Student:
    n=0
    def __init__(self,name):
        self.name=name
        Student.count()
    @classmethod
    def count(cls):
        cls.n+=1
a=Student('蔡徐坤')
b=Student('ikun')
print(Student.n)

# 静态方法: 不依赖于类,也不依赖于对象,就是一个普通的函数放置于类中是结构更加清晰与合理
class A:
    def __init__(self,name):
        self.name=name
    @staticmethod
    def static_func():
        print('静态方法')
obj = A('蔡徐坤')
obj.static_func()

3.属性

class BMI:
    def __init__(self, name, weight, height):
        self.name = name
        self.weight = weight
        self.height = height
    def BMI(self):
        return self.weight / self.height**2

obj =BMI('蔡徐坤',65, 1.77)
print(obj.BMI())
=> 要让bmi方法伪装成属性,虽然在代码级别没有提升,但是看起来更合理
class BMI:
    def __init__(self, name, weight, height):
        self.name = name
        self.weight = weight
        self.height = height
    @property
    def bmi(self):
        return self.weight / self.height**2
    @bmi.setter
    def bmi(self,a):  # 注意要传参数
        print('修改时运行')
    @bmi.deleter
    def bmi(self):
        print('删除时运行')

obj =BMI('蔡徐坤',65, 1.77)
print(obj.bmi)
obj.bmi='唱跳rap'
del obj.bmi
# 设置属性的另外一种写法:
class Foo:
    def get_AAA(self):
        print('get的时候运行我啊')
    def set_AAA(self,value):
        print('set的时候运行我啊')
    def delete_AAA(self):
        print('delete的时候运行我啊')
    bbb = property(get_AAA,set_AAA,delete_AAA) #内置property三个参数与get,set,delete一一对应

f1=Foo()
f1.bbb
f1.bbb='aaa'
del f1.bbb

4.isinstance、issubclass

对象与类之间的关系:
class A:
    pass
class B(A):
    pass
print(isinstance(obj,N))  =>  判断obj对象是否是由N类(N类的派生类)实例化的对象,返回True
类与类之间的关系:
class A:
    pass
class B(A):
    pass
class C(B):
    pass
print(issubclass(C,B))
print(issubclass(C,A))
print(issubclass(M,N))  =>  判断M是否是N(N的派生类)的子类

5.异常处理

异常:程序出现中断,飘红,致使整个项目中断了
错误类型:语法错误、逻辑错误
异常常见种类:
AttributeError 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x
IOError 输入/输出异常;基本上是无法打开文件
ImportError 无法引入模块或包;基本上是路径问题或名称错误
IndentationError 语法错误(的子类) ;代码没有正确对齐
IndexError 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5]
KeyError 试图访问字典里不存在的键
KeyboardInterrupt Ctrl+C被按下
NameError 使用一个还未被赋予对象的变量
SyntaxError Python代码非法,代码不能编译(个人认为这是语法错误,写错了)
TypeError 传入对象类型与要求的不符合
UnboundLocalError 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,
导致你以为正在访问它
ValueError 传入一个调用者不期望的值,即使值的类型是正确的
异常形式:
单分支:
try:
    l1 = [1,2,3]
    print(l1[100])
except IndexError as e:
    print(e)
    print('索引错误')
多分支:
dic = {1: 111,2: 222,3: 333,}
while 1:
    try:
        num = input('请输入序号')
        int(num)
        print(dic[int(num)])
    except KeyError as e:
        print('选项超出范围,请重新输入')
    except ValueError as e:
        print('请输入数字')
# 及时解决异常,程序的分流
万能异常:
try:
    l1 = [1,2,3]
    print(l1[100])
except Exception as e:
    print(e)
什么时候用万能异常,什么时候用多分支?
只是想把这个异常处理掉,让程序继续运行  =>  万能异常
根据不同的异常执行不用的逻辑流程   =>   多分支
万能异常+多分支:
dic = {1: 111,2: 222,3: 333,}
while 1:
    try:
        num = input('请输入序号')
        int(num)
        print(dic[int(num)])
    except KeyError as e:
        print('选项超出范围,请重新输入')
    except Exception:
        pass            
# 万能异常要写在最后
异常处理其他成员:
dic = {1: 111,2: 222,3: 333,}
while 1:
    try:
        num = input('请输入序号')
        int(num)
        print(dic[int(num)])
    except KeyError as e:
        print('选项超出范围,请重新输入')
    except Exception:
        pass
    else:  
        print(666)
# 如果上面无异常执行else语句,否则不执行else语句
finally:
在整个程序终止之前,执行finally,通常用在文件操作、数据库、函数,以文件操作为例:
try:
    f = open('register', mode='w')
    f.write('abc')
    f.write('abc')
    f.write('abc')
    l1 = [1, 2, 3]
    print(l1[1000])
    f.write('abc')
finally:
    f.close()
主动抛出异常:
raise Exception('U R 蔡徐坤')
断言:
assert 条件  =>  条件成立,执行下面代码;条件不成立,终止程序
自定义异常:
class Connection(BaseException):
    def __init__(self,msg):
        self.msg = msg
raise Connection('U R 蔡徐坤')
# 异常处理不能经常使用:耗费性能,代码的可读性变差
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!