一、类的私有成员

1. 类中的私有成员是什么?

私有:只有满足一部分条件的才能使用

  • 私有类的属性
  • 私有对象的属性
  • 私有方法

正常状态

  1. class B:
  2. school_name = '老男孩教育'
  3. def __init__(self,name, sex, age):
  4. self.name = name
  5. self.sex = sex
  6. self.age = age
  7. class A(B): # A的父类是B,这个时候意味着A的实例化对象就可以使用B类中的所有属性或者方法
  8. class_name = 'python23'
  9. def func(self):
  10. print(self.class_name)
  11. print(self.name)
  12. obj = A() # 实例化一个对象A
  13. print(obj.class_name)
  14. obj.func()# 通过实例化对象来执行A类中的方法
  15. print(obj.school_name)
  16. obj = A('alex', '男', 123)
  17. obj.func() #调用A类中的func方法
  18. print(obj.class_name) # 调用A类中的class_name
  19. print(obj.school_name) # 调用B类中的school_name

私有成员有哪些

  1. class A:
  2. company_name = '老男孩教育' # 静态变量(静态字段)
  3. __iphone = '1353333xxxx' # 私有静态变量(私有静态字段)
  4. def __init__(self,name,age): #特殊方法
  5. self.name = name #对象属性(普通字段)
  6. self.__age = age # 私有对象属性(私有普通字段)
  7. def func1(self): # 普通方法
  8. pass
  9. def __func(self): #私有方法
  10. print(666)
  11. @classmethod # 类方法
  12. def class_func(cls):
  13. """ 定义类方法,至少有一个cls参数 """
  14. print('类方法')
  15. @staticmethod #静态方法
  16. def static_func():
  17. """ 定义静态方法 ,无默认参数"""
  18. print('静态方法')
  19. @property # 属性
  20. def prop(self):
  21. pass

2. 设置类的私有静态属性(***)

格式

__girlnum = '1个'

  • 对象在类的外部不能访问,类在外部也不能访问
  • 只能在类的内部可以访问

内部访问方法:封装到方法内部,然后obj.func() #良心教育

类的私有成员有什么用?

如果想设定一些私有的或者是不想让类外面用到的,密码,加密方式等,设置成私有成员即可

例题

  1. # 私有静态属性
  2. class B:
  3. school_name = 'OldBoy'
  4. class A(B):
  5. class_name = 'python23'
  6. _girlnum = '1个' # 我就是私有属性
  7. def func(self):
  8. # print(self.class_name)
  9. print(self.__girlnum)
  10. obj = A() 实例化
  11. print(obj.__girlnum) # 对象在类的外部不能访问,类在外部也不能访问print(A.__girlnum),这种就是私有属性
  12. print(obj.func()) # 在类的内部可以访问
  13. 从类的外部调用
  14. print(obj.calss_name)
  15. 从类的内容部调用
  16. obj.func()
  17. prin(obj.school_name) 对于类的共有静态属性,类的外部,累的内容部,派生类都可调用

3. 设置对象的私有属性

格式:

self.__age = age # 定义方法,这就变成了私有成员了

obj.func()调用方法

  • 在类的外部是无法访问的
  • 在类的内部可以使用
  1. class B:
  2. def __init__(self, name, age)
  3. self.name = name
  4. self.__age = age # 这就变成了私有成员了
  5. def func(self):
  6. print(self.__age)
  7. print(obj.__age)#在类的外部是无法访问的
  8. obj.func()# 在类的内部可以使用
  9. #派生类
  10. 既想用子类也想用父类用super
  11. 子类打印父类属性,派生类中也不能访问

4. 私有成员的拓展

私有成员除了类的内部真的访问不到吗?

  1. class A:
  2. __girl_num = '1个'
  3. print(A._dict_)
  4. # 输出结果
  5. '_A__girlnum'
  6. print(A.__A_girlnum) # 这样是可以访问的,千万不要去访问

python中所有的私有成员,就是在私有成员前面加上__类名而已.所以是可以访问的

二、类的方法和静态方法

类方法 @classmethod用途

  • 把一个对象绑定的方法修改成一个类方法
  • 在方法中任然可以引用类中的静态变量
  • 可以不用实例化对象,就直接用类名在外部调用这个方法

类方法怎么用?(***)

定义方法: @classmethod cls

调用方法: A.a_func() 通过用类名和对象名obj.a_func()调用

  1. class A:
  2. num = 1
  3. def func(self):
  4. print('实例方法')
  5. # 以下就是类方法
  6. @classmethod
  7. def a_func(cls):
  8. print(f'cls-->{cls}')
  9. print('这就是类方法')
  10. # 类方法的调用方法
  11. obj = A()
  12. A.func(obj) # self会得到obj这个对象
  13. A.a_func()# 进行调用

类方法什么时候用?

  • 定义一个方法,默认传self单这个self没有被使用
  • 并且你在这个方法里用到了当前的类名,或者你准备使用这个类的内存空间中的名字的时候
  • 就是你想在实例化之前修改一个类的属性,就可以用这个

例题:统计学生的个数

  1. class Student:
  2. count = 0
  3. def __init__(self, name):
  4. self.name = name
  5. self.count1()
  6. @classmethod
  7. def count1(cls):
  8. cls.count += 1
  9. @classmethod
  10. def print1(cls):
  11. return cls.count
  12. ly = Student('李烨')
  13. sq = Student('扫强')
  14. sq1 = Student('扫强')
  15. sq2 = Student('扫强')
  16. sq3 = Student('扫强')
  17. sq4 = Student('扫强')
  18. print(f'学生共计: {Student.print1()}个')
  19. # 输出结果
  20. 学生共计: 6

静态方法(***)

用途

不依赖于类,也不依赖于对象,他就是一个普通的函数放置于类中是结构更加清晰与合理.

怎么用?

定义一个静态方法:@staticmethod

调用一个静态方法:A.static_func()

例题

  1. class A:
  2. def func(self):
  3. print(111)
  4. @classmethod
  5. def a_func(cls):
  6. print(cls)
  7. @staticmethod
  8. def static_func(a,b,c): # 也可以传参,就当做一个函数用就行
  9. print('静态方法')
  10. A.static_func() # 类调用静态方法
  11. obj = A()
  12. obj.static_func(1,2,3)
  13. 为什么这种函数不写到类的外面?
  14. 也用不着类中的内容,但是为了划分,还是要放置于类中,显得与结构更加清晰与合理
  15. 切记在函数中要用return的方法返回值进行打印.

三、属性(伪装)

用途

将方法伪装成一个属性,这样看起来更合理

operty是一种特殊的属性,访问它时会执行一段功能(函数)然后返回值

有问题的例题

  1. class Bmi:
  2. def __init__(self, hight, shoot):
  3. self.hight = hight
  4. self.shoot = shoot
  5. def bmi(self):
  6. BIM = self.shoot/self.hight**2
  7. return BIM
  8. obj = Bmi(1.75,67)
  9. print(obj.bmi())
  10. # 输出结果
  11. 21.877551020408163

属性怎么用?

伪装一个属性: @property

调用一个属性: obj.bmi 直接执行不用加括号,从执行方法看起来像一个属性,而看起来不是一个方法

将上段代码进行伪装,我们要让bmi伪装成一个属性

  1. class Bmi:
  2. def __init__(self, hight, shoot):
  3. self.hight = hight
  4. self.shoot = shoot
  5. @property
  6. def bmi(self):
  7. BIM = self.shoot/self.hight**2
  8. return BIM
  9. obj = Bmi(1.75,67)
  10. print(obj.bmi) #不用加括号了
  11. # 输出结果
  12. 21.877551020408163

伪装属性有三种@property @aaa.setter @aaa.delter

  1. 1. 先伪装 obj.bmi()变成obj.bmi @property \n def aaa(self): \n print('get的时候执行我')
  2. 2. @aaa.setter --> def aaa(self,v): \n print('修改的时候执行我') --> obj.aa = '太白' # 结果: 太白 aaa三者必须是一致的
  3. 3. @aaa.delter --> def aaa(self): \n print('删除的时候执行我') del Bmi.bmi

注意事项:

  • 设置属性,你的对象属性一定不能出现同名的属性
  • setter,deleter这两个装饰器装饰的函数不能使用return

函数与面向对象的区别

四、isinstance/issubclass/type

isinstance(a,b): 判断a是由b类(b的派生类)实例化的对象.

判断的是类与对象的关系

  1. class A:
  2. pass
  3. class B(A):
  4. pass
  5. obj = B()
  6. print(isinstance(obj,B))
  7. print(isinstance(obj,A))
  8. # 输出结果
  9. True
  10. True
issubclass(M,N)判断M类是N类的子孙
  1. class A:
  2. pass
  3. class B(A):
  4. pass
  5. class C(B):
  6. print(isinstance(C,B))
  7. print(isinstance(C,A))
  8. # 输出结果
  9. True
  10. True

type是什么?

type 是一个原类, 用来判断一个数据类型是由哪个类实例化的对象,python中一切皆对象,一个类也是一个对象,那么这个类对象肯定是由类实例化出来的.

python中你创建的所有类,以及大部分list str 等等这些类都是从type原类实例化得来的

python中继承object类都是新式类.

object也是由type原类实例化得来的

五、异常处理

什么叫异常

你的程序出现中断,飘红,致使你的整个项目中断了.

错误类型

语法错误

​ 自己去避免,就不应该出现在你的代码中

逻辑错误

  1. l1 = [1,2,3]
  2. print(l1[4]) #超过了取值范围

异常错误处理

  • 用if进行异常处理:缺点,嵌套太多,太复杂,只能进行简单的异常处理
  • 用try简单尝试一下

try(***)

从上到下捕捉错误信息,然后进行引流,也有分流的作用

单分支错误就是设置一个except和多分支就是设置多个except

及时解决异常,避免程序中断

  1. status_dic = {
  2. 1: 111,
  3. 2: 333,
  4. 3: 444,
  5. }
  6. while 1:
  7. try:
  8. num = input('请输入序号')
  9. int(num)
  10. print(status_dic[int(num)])
  11. except KeyError as e:
  12. print('选项超出范围,重新输入')
  13. except ValueError as e:
  14. print('请输入数字')

万能异常

  1. status_dic = {
  2. 1: 111,
  3. 2: 333,
  4. 3: 444,
  5. }
  6. while 1:
  7. try:
  8. num = input('请输入序号')
  9. int(num)
  10. print(status_dic[int(num)])
  11. except Exception as e:
  12. print(e)
  13. print(111)

什么时候用万能异常,什么时候用多分支?

  • 如果你只是想把这个异常处理掉,让程序继续执行,这个时候用万能异常
  • 如果出现了异常,你是想根据不同的异常执行不同的逻辑流程,你要采取多分支

万能+多分支

  1. status_dic = {
  2. 1: 111,
  3. 2: 333,
  4. 3: 444,
  5. }
  6. while 1:
  7. try:
  8. num = input('请输入序号')
  9. int(num)
  10. print(status_dic[int(num)])
  11. except KeyError as e:
  12. print('选项超出范围,重新输入')
  13. except ValueError as e:
  14. print('请输入数字')
  15. except Exception:
  16. pass

异常处理的其他成员

  1. status_dic = {
  2. 1: 111,
  3. 2: 333,
  4. 3: 444,
  5. }
  6. while 1:
  7. try:
  8. num = input('请输入序号')
  9. int(num)
  10. print(status_dic[int(num)])
  11. except KeyError as e:
  12. print('选项超出范围,重新输入')
  13. except Exception:
  14. pass
  1. # else
  2. status_dic = {
  3. 1: 111,
  4. 2: 333,
  5. 3: 444,
  6. }
  7. while 1:
  8. try:
  9. num = input('请输入序号')
  10. int(num)
  11. print(status_dic[int(num)])
  12. except KeyError as e:
  13. print('选项超出范围,重新输入')
  14. except Exception:
  15. pass
  16. else: # 不出现异常执行,如果出现异常就不执行
  17. print(666)
  1. # finally
  2. status_dic = {
  3. 1: 111,
  4. 2: 333,
  5. 3: 444,
  6. }
  7. while 1:
  8. try:
  9. num = input('请输入序号')
  10. int(num)
  11. print(status_dic[int(num)])
  12. except KeyError as e:
  13. print('选项超出范围,重新输入')
  14. except Exception:
  15. pass
  16. finally: # 在异常发生之前执行finally
  17. print('执行finally')

使用场景:

  • 文件操作

目的是在报错之前,关闭文件句柄

方法:

  1. try:
  2. xxx
  3. xxx
  4. finally:
  5. print('哈哈哈哈')
  6. f.close()
  1. f = open('register', mode='w')
  2. f.write('fdjsaklfd')
  3. f.write('fdjsaklfd')
  4. f.write('fdjsaklfd')
  5. l1 = [1,2,3]
  6. print(l1[1000])
  7. f.write('fdjsaklffjdsklaf')
  8. f.close()
  9. try:
  10. f = open('register', mode='w')
  11. f.write('fdjsaklfd')
  12. f.write('fdjsaklfd')
  13. f.write('fdjsaklfd')
  14. l1 = [1, 2, 3]
  15. print(111)
  16. print(l1[1000])
  17. f.write('fdjsaklffjdsklaf')
  18. finally:
  19. print('哈哈哈哈')
  20. f.close()
  • 连接数据库引擎

在函数中的finally

  1. def func():
  2. try:
  3. a = 1
  4. b = 2
  5. return a + b
  6. finally:
  7. print(666)
  8. func()

主动抛出异常

Raise Exception('sdfasdf')

断言

  1. assert 条件 # 源码上assert.
  2. assert 1 == 2
  3. print(11)
  4. print(22)
  5. print(33)

自定义异常

  1. TypeError
  2. class Connection(BaseException):
  3. def __init__(self,msg):
  4. self.msg = msg
  5. raise Connection('触发了连接异常')
  1. # 异常处理总结:
  2. # 异常处理不能经常使用:异常处理耗费性能.有些错误是需要进行分流使用.代码的可读性变差.
  3. # 关键节点使用.

python之面向对象的成员,方法,属性,异常处理的更多相关文章

  1. 全面了解python中的类,对象,方法,属性

    全面了解python中的类,对象,方法,属性 python中一切皆为对象,所谓对象:我自己就是一个对象,我玩的电脑就是对象,坐着的椅子就是对象,家里养的小狗也是一个对象...... 我们通过描述属性( ...

  2. python面向对象的成员、属性等

    #类成员: #字段 self.xy =qq . xy=qq #普通字段 (保存在对象里面) #直接通过点(.)+ 字段 进行调用 #静态字段 (保存在类里面) #静态字段属于类,在内存只保留一份 . ...

  3. NO.7:自学python之路------类的方法、异常处理、socket网络编程

    引言 我visual studio 2017就算体积巨大.启动巨慢.功能简陋也不会安装PyCharm的,嘿呀,真香.好吧,为了实现socket网络编程,更换了软件. 正文 静态方法 只是在名义上归类管 ...

  4. python程序设计——面向对象程序设计:方法

    类中定义的方法分为四类:公有方法,私有方法,静态方法,类方法 公有方法.私有方法都属于对象,私有方法的名字以"__"开始 每个对象都有自己的公有方法和私有方法,这两类方法可以访问属 ...

  5. python之面向对象函数与方法,反射,双下方法

    一.函数和方法 1.函数和方法的区别 函数: 全都是显性传参,手动传参,与对象无关 方法: 存在隐性传参,与对象有关 1.1通过函数名可以判断 len()就是函数 str.count()就是方法 de ...

  6. Python 进阶 - 面向对象

    Python 面向对象 面向过程 把完成某个需求的所有步骤,从头到尾逐步实现 根据开发需求,将某些功能独立的代码封装成一个又一个函数 最后完成的代码,就是顺序地调用不同的函数 面向过程特点: 注重步骤 ...

  7. python_way,day8 面向对象【多态、成员--字段 方法 属性、成员修饰符、特殊成员、异常处理、设计模式之单例模式、模块:isinstance、issubclass】

    python_way day8 一.面向对象三大特性: 多态 二.面向对象中的成员 字段.方法属性 三.成员修饰符 四.特殊成员 __init__.__doc__.__call__.__setitem ...

  8. python 面向对象、特殊方法与多范式、对象的属性及与其他语言的差异

    1.python 面向对象 文章内容摘自:http://www.cnblogs.com/vamei/archive/2012/06/02/2532018.html   1.__init__() 创建对 ...

  9. Python进阶----类的结构(公有成员 , 私有成员(私有属性,私有方法),类方法,静态方法,属性) ,isinstance 和issubcalss ,元类(type())

    Python进阶----类的结构(公有成员 , 私有成员(私有属性,私有方法),类方法,静态方法,属性) ,isinstance 和issubcalss ,元类(type()) 一丶类的结构细分    ...

随机推荐

  1. C++中如何对单向链表操作

    */ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...

  2. C++扬帆远航——17(递归函数求阶乘)

    /* * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:阶乘.cpp * 作者:常轩 * 微信公众号:Worldhell ...

  3. Python:turtle库的使用及图形绘制

    目录 一.绘制一个八边形 二.绘制一个八角图形 三.简述问题 四.循环程序设计 五.绘制一个自己喜欢的图形 一.绘制一个八边形 使用turtle库,绘制一个八边形 代码: from turtle im ...

  4. Spring,SpringMVC,MyBatis,SSM配置文件比较

    Spring配置文件: applicationContext.xml applicationContext.xml是Spring的核心配置文件 IOC/DI,AOP相关配置都是在这个文件中 Sprin ...

  5. JDBC大数据的采取

    ## JDBC的大类型数据的存取 ## # 基本概念: |-- 大文本类型数据和大二进制数据: 主要思想用于将大型的二进制数据(字节) 或是大型的文本数据(字符)从磁盘文件中读取 到数据库中,或是从数 ...

  6. RTMP协议推流交互流程

    目录 RTMP协议推流交互流程 RTMP协议推流流程 RTMP握手 RTMP建立连接 RTMP建流&Play Wireshark抓个RTMP流 RTMP协议推流交互流程 想了解下直播常见协议R ...

  7. Enbale IE mode in Edge

    1. 打开Edge, 在地址栏输入 edge://flags/ 2. 搜索 Enable IE Integration , 配置为 IE mode 3. 找到Edge的启动程序路径.如 C:\Prog ...

  8. 前端开发: webStorm手机真机调试

    目录 1. 做好准备工作 2. 开始设置 3. 配置路径 4. 匹配路径设置 5. 设置完成,即可体验 文章首发微信公众号飙码人生 2018-05-21 18:21:15 1. 做好准备工作 安装we ...

  9. XCTF---easyjni的WriteUp

    一.题目来源     题目来源:XCTF的mobile区的easyjni题目.     题目下载地址:题目链接地址 二.解题过程     1.下载好题目后,安装到夜神模拟器中,发现有一个输入框和一个按 ...

  10. 05 Linux目录速查表

    /:根目录,一般根目录下只存放目录,在 linux 下有且只有一个根目录,所有的东西都是从这里开始 当在终端里输入 /home,其实是在告诉电脑,先从 /(根目录)开始,再进入到 home 目录 /b ...